Dupliqué possible: strong>
est double multiplication brisée dans .NET? P>code JavaScript: strong> p>
xxx pré> http://jsfiddle.net/upue6/4/ p>
Je m'attendais à: strong> p>
xxx pré> mais obtenu ceci: strong> p>
xxx pré> pourrait-on expliquer ce qui se passe là-bas? > p> blockQuote>
5 Réponses :
Vous voyez un artefact de la façon dont les ordinateurs font des arithmétiques de point flottant. Voir, par exemple, http://fr.wikipedia.org/wiki/floitant_point#machine_precision p>
Tous les chiffres ne peuvent pas être représentés exactement, même s'ils ont une simple représentation dans la notation décimale. En effet, JavaScript utilise IEEE 754 pour représenter des valeurs de point flottant et utilise ainsi la base 2 au lieu de la base 10. Cela vous conduit à ne pas soustraire 0,1 (même si votre code source le dit), mais une valeur proche de celle-ci. P>
Vous avez affaire à un numéro de point flottant. Découvrez les méthodes Tofixed et TopRecision. P>
Cela résoudra votre problème
http://jsfiddle.net/avpnx/ p >
var n = 1; while ( n > 0 ){ n -= 0.1; result = n.toFixed(1); document.body.innerHTML += result + "<br/>"; }
de Le guide de point flottant : p>
Pourquoi mes numéros ne sont-ils pas 0,1 + 0,2 ajouter à une belle ronde 0,3, et Au lieu de cela, j'ai un résultat étrange comme 0.30000000000000004? STRUT> P>
Parce que, en interne, les ordinateurs utilisent un format (point flottant binaire) qui ne peut pas représenter avec précision un nombre comme 0,1, 0,2 ou 0,3 du tout. p>
lorsque le code est compilé ou interprété, votre "0,1" est déjà arrondi au nombre le plus proche dans ce format, qui donne un petit Erreur d'arrondi même avant la Le calcul arrive. p> blockQuote>
+1 Cela aurait dû être la réponse acceptée (ou alternativement la mine).
Dupe de tant de DuPes boucle étrange sur Java pour 0,1 à 2 ou La double multiplication est-elle cassée dans .NET? . Voir la Détails de Gory .