2014-05-09 161 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

它的使用是錯誤的,因爲被解析的東西已經是一個數字。無論如何,缺少點;) –