Đó 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);
}
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) –
'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
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;) –