关于jquery:JavaScript计时器中的浮点数不会正确增加

Floating number in JavaScript timer doesn't increase correctly

本问题已经有最佳答案,请猛点这里访问。

我想要一个小计时器,它在setInterval()的帮助下增加HTML容器中的数字。我的代码如下(jsfiddle):

1
2
3
4
5
6
7
8
var currentTime = 0;

window.setInterval(timer, 100)

function timer() {
    currentTime = currentTime + 0.1;    
    $('#time').text(currentTime);
}

不幸的是,这不仅增加了0.1每个间隔,而且增加了0.1000001(或类似的东西)。有人能解释一下为什么吗?


原因:这是因为浮点不能在内存中准确表示。总是有一些舍入误差。解决方案:您必须使用整数,当必须显示时间时,将整数除以,然后显示值,直到小数点后的第一位。这样地:

1
2
3
4
5
6
7
8
var currentTime = 0;

window.setInterval(timer, 100)

function timer() {
    currentTime = currentTime + 1;    
    $('#time').text(currentTime / 10);
}

小提琴:http://jsfiddle.net/2nlac/1/更多信息:如需了解有关浮点数的更多信息,请参阅:http://docs.oracle.com/cd/e19957-01/806-3568/ncg_goldberg.html


您还可以使用tofixed函数将长浮点值修剪为小数点后2位。如下图所示。

1
2
3
4
5
6
7
8
var currentTime = 0;

window.setInterval(timer, 100)

function timer() {
    currentTime = currentTime + 0.1;    
    $('#time').text(currentTime.toFixed(2));
}


这与十进制值如何转换为二进制浮点数有关。1/10转换为二进制的重复小数,因此数字不能完全表示,重复的操作可能会暴露错误。

javascript使用IEEE-754浮点数作为记录。

浮点数小数点后的部分存储为分数和。它们是通过加上一系列分数来计算的。分数的顺序是:

1/2,1/4,1/8,1/16,1/32,1/64,1/128,…

然后转换成二进制。

因此,浮点数不能精确计算。

检查此文档


您可以用一个整数增加当前时间,并在输出时将其除数。

1
2
3
4
5
6
7
8
var currentTime = 0;

window.setInterval(timer, 100)

function timer() {
    currentTime++;    
    $('#time').text(currentTime/10);
}


浮点计算在javascript中有一些缺陷,您可以使用tofixed方法来解决这个问题。

1
 currentTime = (currentTime + 0.1).toFixed(1);