2014-05-09 7 views
19

arrêt de la minuterie après 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>

Comme vous le voyez, le nombre de minuterie uniquement jusqu'à 0.29.

Pourquoi est-ce?

Répondre

24

C'est en raison de la façon dont fonctionne le calcul à virgule flottante couplé avec votre parseInt(). Voir Is floating point math broken.

Quand il atteint 0.29, il ne 0.29 x 100, que vous vous attendez à entraîner 29 mais en réalité il est:

console.log(0.29 * 100); 
28.999999999999996 

Ensuite, vous le convertir en un entier en utilisant parseInt() qui se traduit par 28 (suppression tous les décimales), enfin vous ajoutez 1 et divisez par 100 en faisant le résultat 0.29 et cela est répété sur chaque tick de la minuterie, le nombre ne peut pas augmenter.

Il serait préférable de stocker la valeur brute en tant que variable et de la sortir en utilisant .toFixed(2), au lieu d'utiliser le numéro de l'interface utilisateur comme source. Comme ceci:

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

Il convient également de noter que 'parseInt' est redondant parce que' '* jette à toute façon numérique (et dans ce cas, la fonction est nuisible) –

+2

' parseInt' ISN Ce n'est pas redondant ici, c'est la source du problème car il supprime les décimales qui finissent par amener le nombre à "0.29". Si vous supprimez le 'parseInt()', le compteur continue au-delà de '0.29' (bien qu'il montre les décimales complètes). – MrCode

+0

Son utilisation est erronée parce que la chose étant analysée est déjà un nombre. De toute façon, manquant le point;) –

Questions connexes