php计算浮点数

时间:2010-04-18 09:54:57

标签: php math floating-point

我这里有一个奇怪的数学计算。我希望有人会解释。

$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;

最后$i值应该为0,但它返回6.93889390391E-18。

3 个答案:

答案 0 :(得分:6)

你应该阅读这篇文章:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

浮点运算并不准确。你应该期待小错误。答案是正确的,在一个小的舍入错误。如果你需要检查浮点数是否为零,最好不要检查它是否完全等于零,而是检查它是否足够接近零。

如果您确实需要精确算术,请不要使用浮点类型。在您的示例中,您可以将所有数字乘以100,并使用整数运算来获得精确答案。

答案 1 :(得分:2)

  

是否有任何想法纠正我的等式以显示最终结果0.00?

是的,round($i, 2)

“差异”通常很小,将其四舍五入到几乎总能解决问题。

答案 2 :(得分:2)

那里没有任何错误,只有近似的舍入。

在这个cas中你应该将你的所有值乘以1000并在计算结束时进行除法,或者更好地求助于precise calculation extension