PHP简单数学计算

时间:2011-08-27 18:32:19

标签: 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;
}
?>

5 个答案:

答案 0 :(得分:5)

这是与二进制浮点数相关的舍入误差的常见情况。有些数字无法用二进制精确表示,因此结果将有一定差距。要阅读它,关于floating point numbers的维基百科文章很棒。

在这种情况下找到的通常模式是选择一个增量并与之进行比较:

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

你必须根据用例适当选择你的delta。

答案 1 :(得分:3)

检查它们是否有差异小于0.00001

if(abs($total - $sum) < 0.00001){

http://sandbox.phpcode.eu/g/56905/6

This article shows you why is this happening

答案 2 :(得分: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

该行仅表示$ total必须在$ sum的0.0000001之内才能被视为相等。您可以自己选择号码,具体取决于您需要的精确度。

或者你可以在这种情况下围绕$sum,但是你基本上只使用2.5 - 3.499...而不是2.9999999 - 3.0000001

的范围做同样的事情

答案 3 :(得分:1)

差异是由于浮点精度的限制。

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

答案 4 :(得分:1)

花车是邪恶的。

来自http://php.net/float

“所以永远不要将浮动数字结果信任到最后一位数字,并且永远不要将浮点数比较为相等。如果需要更高的精度,则可以使用任意精度数学函数和gmp函数。”