2010-03-02 6 views
1

Pourquoi 9.1 + 3.3 n'est pas 12.4?résultat de la somme

<script> 

    alert(9.1 + 3.3) 

</script> 

Résultat: 12,399999999

... et comment dois-je résumer ce?

+1

Je suis assez sûr qu'une question presque exactement comme celle-ci a été posée comme il y a 2 semaines. – animuson

+1

Lire ceci: http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary – codaddict

+2

@animuson: C'est une loi des forums de programmation que cette question se pose une fois un semaine, et aussi la 3ème constante de la vie: la mort, les taxes, et quelqu'un va se plaindre de mathématiques à virgule flottante. –

Répondre

2

Il s'agit d'une erreur en virgule flottante dans laquelle la variable ne peut pas stocker la valeur avec précision. Si vous ne travaillez qu'à une décimale, vous pouvez multiplier tous vos chiffres par 10 pour faire des calculs car cela gardera tous les nombres comme entiers et vous ne devriez pas avoir le problème que vous voyez. Évidemment, lorsque vous affichez le numéro, vous devrez le diviser par 10.

+0

beau travail autour vraiment. – TecHunter

2

Cela vient de la précision du nombre à virgule flottante. Ce problème vient avec chaque langage de programmation et est causé par le fait qu'un nombre réel peut avoir un nombre illimité de chiffres. Donc, il est toujours donné avec une précision.

Vous pouvez essayer: Number(9.1+3.3).toPrecision(3)

+0

J'ai besoin de la valeur entière ... Number (9 + 3) .toPrecision (3) résultat: 12.0 – Leo

0

Intéressant que en échangeant les valeurs que vous obtenez le résultat correct!

0

La cause est le nombre à virgule flottante. Vous pouvez avoir une méthode pour arrondir le nombre aux endroits désirés après la virgule.

<script language="javascript"> 

function formatNumber(myNum, numOfDec) 
{ 
var decimal = 1 
for(i=1; i<=numOfDec;i++) 
decimal = decimal *10 

var myFormattedNum = (Math.round(myNum * decimal)/decimal).toFixed(numOfDec) 
return(myFormattedNum) 
} 
</script> 
0

Utilisation fonction Math.round pour arrondir les valeurs.

alerte (Math.round (9.1 + 3.3));

2

Essayez

alert((9.1 + 3.3).toFixed(1));

La méthode toFixed() formate un nombre d'utiliser un certain nombre de décimales de fuite.

Le nombre est arrondi à la valeur supérieure et des valeurs NULL sont ajoutées après la virgule décimale (si nécessaire) pour créer la longueur décimale souhaitée.

+0

J'ai besoin de la valeur entière ... alert ((9 + 3) .toFixed (1)); résultat: 12.0 – Leo

2

C'est le fantôme héréditaire IEEE 754 de JavaScript qui vous hante, vous et tous les autres développeurs JavaScript.

Jetez un oeil à Crockford's presentation et vous en aurez obtenir une meilleure compréhension

Et comment: vous devez faire vos décimaux en nombres entiers en les multipliying et à la fin les retransformer en décimales.

+0

en effet: '(9.1 * 10 + 3.3 * 10)/10 = 12.4' –

+1

Grande présentation, le bit sur IEEE 754 est d'environ 15 minutes si quelqu'un veut passer directement à cela. –

Questions connexes