JavaScript计时器中的浮点数不会正确增加

时间:2013-12-12 09:00:07

标签: javascript jquery floating-point

我想要一个小计时器,它会在setInterval() html容器中的数字的帮助下增加。 我的代码看起来像这样(jsfiddle):

var currentTime = 0;

window.setInterval(timer, 100)

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

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

浮点数的

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

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

然后转换为二进制。

因此浮动不能真正精确计算。

选中此document

答案 2 :(得分:1)

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

var currentTime = 0;

window.setInterval(timer, 100)

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

答案 3 :(得分:0)

你可以用整数增加当前时间并在输出时将其除去

var currentTime = 0;

window.setInterval(timer, 100)

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

答案 4 :(得分:-1)

浮点计算在javascript中有一些错误,你可以通过使用方法toFixed来解决这个问题。

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