我想要一个小计时器,它会在setInterval()
html容器中的数字的帮助下增加。
我的代码看起来像这样(jsfiddle):
var currentTime = 0;
window.setInterval(timer, 100)
function timer() {
currentTime = currentTime + 0.1;
$('#time').text(currentTime);
}
不幸的是,这不仅增加0.1每个间隔,而且添加0.1000001(或类似的东西)。有人能解释我为什么吗?
答案 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);