2014-05-09 6 views
19

Timer arresto dopo 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>

Come si vede, timer conta solo fino a 0.29.

Perché è?

risposta

24

È a causa del modo in cui la matematica in virgola mobile funziona insieme al tuo parseInt(). Fare riferimento a Is floating point math broken.

Quando raggiunge 0.29, lo fa 0.29 x 100, che vi aspettate di provocare 29 ma in realtà è:

console.log(0.29 * 100); 
28.999999999999996 

Avanti, si converte in un numero intero utilizzando parseInt() che si traduce in 28 (rimozione tutte le cifre decimali), infine si aggiunge 1 e si divide per 100 rendendo il risultato 0.29 e questo si ripete su ogni tick del timer, il numero non può aumentare.

Sarebbe preferibile memorizzare il valore grezzo come variabile e inviarlo utilizzando .toFixed(2), anziché utilizzare il numero sull'interfaccia utente come origine. Come questo:

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

Va inoltre notato che 'parseInt' è ridondante perché' '* getta a numerico comunque (e in questo caso la funzione è nocivo) –

+2

' parseInt' isn È ridondante qui, è la fonte del problema perché rimuove le cifre decimali che alla fine fanno sì che il numero si attacchi a "0,29". Se si rimuove il 'parseInt()', il contatore continua oltre '0.29' (anche se mostra le posizioni decimali complete). – MrCode

+0

Il suo uso è fuorviante perché la cosa che viene analizzata è già un numero. Ad ogni modo, manca il punto;) –