2014-05-09 17 views
19

hẹn giờ dừng sau 0,29

<head> 
 
    <script> 
 
     window.setInterval(function(){timer()},100); 
 
     function timer() 
 
      { 
 
       document.getElementById("timer").innerHTML= 
 
       (parseInt(document.getElementById("timer").innerHTML*100)+1)/100; 
 
      } 
 
    </script> 
 
    </head> 
 
    <body> 
 
     <div id="timer">0.000</div> 
 
    </body>

Như bạn thấy, hẹn giờ đếm chỉ lên đến 0.29.

Tại sao lại như vậy?

Trả lời

24

Đó là do cách hoạt động của toán học dấu phẩy động cùng với parseInt() của bạn. Tham khảo Is floating point math broken.

Khi nó đạt đến 0.29, nó 0.29 x 100, mà bạn đang mong đợi dẫn đến 29 nhưng thực sự nó là:

console.log(0.29 * 100); 
28.999999999999996 

Tiếp theo, bạn chuyển nó sang một số nguyên sử dụng parseInt() mà kết quả trong 28 (loại bỏ tất cả các vị trí thập phân), cuối cùng bạn thêm 1 và chia cho 100 thực hiện kết quả 0.29 và điều này được lặp lại trên mỗi lần đánh dấu của bộ hẹn giờ, số không thể tăng.

Sẽ tốt hơn nếu lưu trữ giá trị thô dưới dạng biến và xuất nó bằng cách sử dụng .toFixed(2), thay vì sử dụng số trên giao diện người dùng làm nguồn. Như thế này:

Fiddle

var num = 0.00; 

window.setInterval(function() { 
    timer(); 
}, 100); 

function timer() { 
    num = ((num * 100) + 1)/100; 
    document.getElementById("timer").innerHTML = num.toFixed(2); 
} 
+0

Nó cũng cần lưu ý rằng 'parseInt' là không cần thiết vì' * 'phôi để số nào (và trong trường hợp này chức năng là có hại) –

+2

'parseInt' isn 'd dự phòng ở đây, nó là nguồn gốc của vấn đề bởi vì nó loại bỏ các chữ số thập phân mà cuối cùng gây ra số để dính vào' 0.29'. Nếu bạn loại bỏ 'parseInt()', bộ đếm tiếp tục vượt quá '0.29' (mặc dù hiển thị các chữ số thập phân đầy đủ). – MrCode

+0

Việc sử dụng nó bị sai lệch bởi vì thứ đang được phân tích cú pháp đã là một con số. Dù sao, thiếu điểm;) –

Các vấn đề liên quan