2011-08-27 127 views
3

可以帮我看看这个计算吗?它假设回声 “等于” ...但它给我 “不等于”PHP简单数学计算

<?php 
$tl_pax = 1; 
$ct_pax = 2; 
$at_pax = 2; 

$a = 0.5; 
$b = 0.2; 
$c = 0.2; 
$d = 0.2; 
$e = 0.2; 
$f = 0.2; 
$g = 0.2; 
$h = 0.9; 

$sum = $a + $b + $c + $d + ($e * $tl_pax) + ($f * $ct_pax) + ($g * $at_pax) + $h; 

$total = 3; 

if($total == $sum){ 
    echo 'equal: ' . $sum . ' - ' . $total; 
} 
else{ 
    echo 'not equal: ' . $sum . ' - ' . $total; 
} 
?> 
+0

什么是输出总和与总的范围? –

+0

[Floating point miscuracy examples]可能的重复(http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples) – Gordon

回答

5

这是与二进制浮点数相关的舍入误差的常见情况。有些数字不能完全用二进制表示,因此结果会有一定的差距。要阅读它,关于floating point numbers的维基百科文章是伟大的。

在这种情况下,发现了以往的模式是选择一个三角形和比较反对:

if(abs($total - $sum) < 0.01) 
    echo "equal"; 

你必须appropiately挑你的三角洲根据用例。

+2

也许你应该使'if(abs($ total - $ sum)<0.01)' – Medo42

+0

忘记了abs。谢谢! – Femaref

1

区别是由于浮点精度的限制。

像0.9(9/10)这样的值不能精确地写成二进制浮点数,就像0.3333 ...(1/3)不能精确地写成小数部分一样。这意味着例如$ h拥有0.9的不精确的圆形表示。因此,您的计算结果产生的结果非常接近3,但不完全是3.

1

浮子是邪恶的。

报价从http://php.net/float

“所以永远不要相信浮点数结果到了最后一位,也永远不要比较两个浮点数是否相等。如果需要更高的精度是必要的,任意精度数学函数和GMP功能可用。 “

2

这是因为你的总和实际上是类似2.9999999999999999999,由于浮动蓬算术。当你打印时,PHP会隐藏你的信息。请参阅floor((0.1+0.7)*10)上的示例:http://php.net/manual/en/language.types.float.php

您不应该为相等性比较浮点数。比较浮动的正确方法是使用范围,如:

if($total-0.0000001 <= $sum && $sum <= $total+0.0000001){ 

你可以看到它在这里的行动:http://codepad.org/kaVXM5g0

这条线只是意味着$总必须在$总和的0.0000001被视为相等。您可以自己挑选数字,具体取决于您需要的精度。

或者你可以只轮$sum在这种情况下,但此时你基本上做同样的事情只是从2.5 - 3.499...而不是2.9999999 - 3.0000001