È 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);
}
Va inoltre notato che 'parseInt' è ridondante perché' '* getta a numerico comunque (e in questo caso la funzione è nocivo) –
' 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
Il suo uso è fuorviante perché la cosa che viene analizzata è già un numero. Ad ogni modo, manca il punto;) –