可以帮我看看这个计算吗?它假设回声“相等”......但它给了我“不平等”
<?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 :(得分:5)
这是与二进制浮点数相关的舍入误差的常见情况。有些数字无法用二进制精确表示,因此结果将有一定差距。要阅读它,关于floating point numbers的维基百科文章很棒。
在这种情况下找到的通常模式是选择一个增量并与之进行比较:
if(abs($total - $sum) < 0.01)
echo "equal";
你必须根据用例适当选择你的delta。
答案 1 :(得分:3)
答案 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)
花车是邪恶的。
“所以永远不要将浮动数字结果信任到最后一位数字,并且永远不要将浮点数比较为相等。如果需要更高的精度,则可以使用任意精度数学函数和gmp函数。”