Floating number in JavaScript timer doesn't increase correctly
本问题已经有最佳答案,请猛点这里访问。
我想要一个小计时器,它在
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); |