2010-11-12 4 views
3

Possible en double:
Is JavaScript's Math broken?Javascript ajout flotteur

<html> 
<body> 

<script type="text/javascript"> 
var w = 0; 
var weight1 = parseFloat("0.6"); 
var weight2 = parseFloat("0.3"); 
w = weight1 + weight2; 

document.write("total weight: " + w); 
</script> 

</body> 
</html> 

Pourquoi cette impression ,8999999999999999 et non 0,90000000

+8

Bienvenue aux nombres à virgule flottante! –

+0

Duplicata de http://stackoverflow.com/questions/1088216/whats-wrong-with-using-to-compare-floats-in-java? – PleaseStand

+0

Voir: http://stackoverflow.com/questions/1036662/weird-javascript-behaviour-floating-point-addition-giving-the-wrong-answer –

Répondre

4

Comme le nombre 9/10 ne peut pas être représenté proprement dans base 2, tout comme le nombre 1/3 ne peut pas être correctement représenté dans la base 10.

-1

Pour répondre à votre question - les points flottants ont autant de précision que votre RAM peut le permettre. Si vous créez un flottant 1 - il peut effectivement être 1,000000000000000000001

Il est évident que vos solutions comprennent arrondir le nombre, ou à l'aide ints

+3

n'a rien à voir avec la RAM, et spécifier la valeur flottante exacte 1 ne produira jamais rien d'autre que 1. Cela a à voir avec des nombres répétitifs - tout comme 1/3 ne peut pas être représenté comme une séquence de chiffres finis dans la base 10, le Le nombre 1/10 ne peut pas être représenté comme une séquence de chiffres finis dans la base 2. – cdhowie

+0

Je me trompais vraiment sur celui-là. Voici ce que j'ai testé, et conclu incorrectement: ((1/10) * 1e63) - 1e62 = 1.141798154164768e + 46 – Mikhail

0

La façon dont les nombres à virgule flottante sont faits, certaines valeurs ne peuvent pas être représentés avec précision. C'est une limitation de ce type de données, il y a peu ou rien que vous puissiez faire pour le réparer, vous devez juste anticiper cela, et utiliser round ou quelque chose comme ça.

http://en.wikipedia.org/wiki/Floating_point

0

Erreurs d'arrondi simples. Les nombres à virgule flottante ne sont pas précis. Cela rend les comparaisons un peu plus compliquées. Par exemple. If (my_float == 3.0) échouera invariablement.