2014-05-09 126 views
19

计时器停止后0.29

<head> 
 
    <script> 
 
     window.setInterval(function(){timer()},100); 
 
     function timer() 
 
      { 
 
       document.getElementById("timer").innerHTML= 
 
       (parseInt(document.getElementById("timer").innerHTML*100)+1)/100; 
 
      } 
 
    </script> 
 
    </head> 
 
    <body> 
 
     <div id="timer">0.000</div> 
 
    </body>

正如你看到的,定时器计数仅达0.29

为什么?

回答

24

这是因为浮点运算的方式与您的parseInt()结合在一起。请参阅Is floating point math broken

当它到达0.29,它0.29 x 100,这你期待导致29,但实际上它是:

console.log(0.29 * 100); 
28.999999999999996 

接下来,将其转换为使用parseInt()整数导致28(除所有的小数位),最后你加1并除以100使得结果0.29并且这个在计时器的每个tick上重复,数字不能增加。

将原始值存储为变量并使用.toFixed(2)输出它会更好,而不是将UI上的数字用作源。就像这样:

Fiddle

var num = 0.00; 

window.setInterval(function() { 
    timer(); 
}, 100); 

function timer() { 
    num = ((num * 100) + 1)/100; 
    document.getElementById("timer").innerHTML = num.toFixed(2); 
} 
+0

还应当指出的是,'parseInt'是多余的,因为'*'强制转换为数字反正(在这种情况下该功能是有害的) –

+2

'parseInt' ISN在这里是多余的,这是问题的根源,因为它消除了最终导致数字坚持在0.29处的小数位数。如果删除'parseInt()',计数器会继续超过0.29(尽管显示完整的小数位)。 – MrCode

+0

它的使用是错误的,因为被解析的东西已经是一个数字。无论如何,缺少点;) –