Comportement étrange de Javascript: ajout de point flottant donnant la mauvaise réponse

Duplication possible:
Les mathématiques de JavaScript sont-elles rompues?

Cela semble vraiment stupide, mais lors de l'exécution, il affichera

7.300000000000001 au lieu de 7.3

<script language="javascript"> function buttonClicked() { var mySum = 1.1 + 1.1 + 1.1 + 0 + 4; alert(mySum); } </script> 

Qu'est-ce qui causerait cela? J'ai le javascript sur une très jolie page aspx. Nous utilisons actuellement javascript pour ajouter des valeurs à partir d'entrées de formulaire, ce n'était qu'un exemple avec des nombres qui le faisaient tomber, il y en a beaucoup d'autres.

Une idée de ce qui pourrait être fait?

Il s'agit de la façon dont les valeurs décimales sont converties en nombres à virgule flottante. 1/10 se transforme en une décimale répétitive en binaire, de sorte que le nombre n'est pas parfaitement représenté, et les opérations répétées peuvent exposer l'erreur.

JavaScript utilise des nombres à virgule flottante IEEE-754, pour mémoire. D'autres langues ont le même problème.

Comment y faire face? Dans votre cas, peut-être à la précision () .

La partie Mantissa (la partie après la virgule) des nombres de points flottants est stockée en tant que somme de fractions. Ils sont calculés en ajoutant une série de fractions. L'ordre des fractions est:

 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, ... etc 

La représentation binaire est stockée sous 0s et 1s qui indiquent oui / non. Par exemple, 001010 serait 0 * 1/2 + 0 * 1/4 + 1 * 1/8 + 0 * 1/16 + 1 * 1/32.

C'est un exemple approximatif de pourquoi les points flottants ne peuvent pas être exacts. Lorsque vous ajoutez de la précision (flotteur -> double -> long double), vous obtenez plus de précision dans la limite.

Les données binaires sous-jacentes stockées sont divisées en deux parties: une pour la partie qui apparaît avant le point décimal et l'autre pour la partie après la virgule. C'est une norme IEEE qui a été adoptée en raison de la vitesse à laquelle les calculs peuvent être effectués (et probablement d'autres facteurs sur le dessus).

Consultez ce lien pour plus d'informations: http://docs.sun.com/source/806-3568/ncg_goldberg.html

http://docs.sun.com/source/806-3568/ncg_goldberg.html

Ce que tout le monde devrait savoir sur les nombres à virgule flottante.