2010-04-18 5 views
3

J'ai un calcul mathématique étrange ici. J'espère que quelqu'un va t'expliquer.php calculer float

$a = 1.85/100; 
$b = 1.5/100; 
$c = 1.1/100; 
$d = 0.4/100; 
$e = 0.4/100; 
$f = 0.4/100; 
$g = 0.4/100; 

$h = $a + $b + $c + $d + $e + $f + $g; 

echo $h*100 ."<br>"; 
$i = $h-$a; 
$i = $i-$b; 
$i = $i-$c; 
$i = $i-$d; 
$i = $i-$e; 
$i = $i-$f; 
$i = $i-$g; 

echo $i; 

La dernière valeur $i doit être 0 mais il retourne 6.93889390391E-18.

+3

Ce sont les bizarreries de point flottant Arithmétique. Lire http://docs.sun.com/source/806-3568/ncg_goldberg.html – Gumbo

+0

0,004 - $ g = 0; mais 0,004 - $ i = 6,93889390391E-18; une idée pour corriger cela? – apis17

Répondre

2

une idée pour corriger mon équation pour afficher le résultat final 0.00?

Ouais, round($i, 2)

Les « anomalies » sont généralement si petites, que l'arrondi à 2 décimales résoudra presque toujours le problème.

+0

merci .. :) cela renvoie 0 .. – apis17

+1

utilisez number_format() à la place si vous voulez le forcer à afficher deux décimales. –

+0

btw, je vois que vous utilisez jusqu'à 3 décimales dans vos calculs, donc vous devriez probablement arrondir à 4 en cas de divergence réelle .. –

6

Vous devriez lire cet article:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

arithmétique en virgule flottante n'est pas exact. Vous devriez vous attendre à de petites erreurs. La réponse est correcte à l'intérieur d'une petite erreur d'arrondi. Si vous avez besoin de vérifier si un nombre à virgule flottante est zéro, il vaut mieux ne pas vérifier qu'il est exactement égal à zéro mais plutôt vérifier s'il est suffisamment proche de zéro.

Si vous avez vraiment besoin de l'arithmétique exacte, n'utilisez pas les types à virgule flottante. Dans votre exemple, vous pouvez multiplier tous vos nombres par 100 et utiliser l'arithmétique des nombres entiers pour obtenir une réponse exacte.

+0

wow si l'explication des détails. une idée pour corriger mon équation pour montrer le résultat final 0.00? – apis17

+0

Puisque tous vos nombres sont rationnels, vous pouvez faire vos calculs en utilisant des nombres rationnels et obtenir un résultat exact. – porges

+0

merci porges .. – apis17

2

Il n'y a rien de mal à y aller, il y a simplement une approximation d'arrondi.

Dans ce même vous devez multiplier CAS toutes vos valeurs pour 1000 et faire une division à la fin du calcul ou, mieux, le recours à precise calculation extension

+0

belle info eineki. cela m'aidera à faire attention à un autre calcul. merci à tous pour votre aide. – apis17