php浮动数学运算bug?

时间:2011-11-15 05:56:57

标签: php floating-accuracy

此处的摘要:

$a = 213480.7-190.46;
exit($a-213290.24);
# 2.9103830456734E-11

结果输出假设为0.但输出

操作结果的故事:

$b is : 213480.7
-190.46
$b is : 213290.24

现在余额看起来正确。但是当使用比较运算符时......结果很奇怪 这是var_dump和比较结果

var_dump($b);
# float 213290.24

if ($b==213290.24) {
    exit('same');
} elseif ($b>213290.24) {
    exit('larger '.($b-213290.24));
} else {
    exit('smaller '.($b-213290.24));
}
#larger 2.9103830456734E-11

谁能告诉我如何解决它?

3 个答案:

答案 0 :(得分:2)

对浮点数值执行的计算始终具有inherent error,这是因为它们的机器表示。因此,您不应使用等于运算符==来比较浮点值。

典型的方法是确定最小允许误差,并检查要比较的值之间的差异是否小于所需的误差。

$min_error = 0.00001;
if (abs($a - $b) < $min_error) 
{
   exit("same");
}

答案 1 :(得分:2)

见这里:http://php.net/manual/en/language.types.float.php

  

所以永远不要将浮动数字结果信任到最后一位数字,永远不要   比较浮点数是否相等。如果精度更高   必要的,任意精度数学函数和gmp函数   可用。

处理浮点比较的常用方法是添加一个允许的epsilon,或浮点值的小差异,因此小容差范围内的任何内容都被视为等效。

if (abs(213290.24 - $b) < .001) {
    exit('same')
}

答案 2 :(得分:0)

这不是php的问题,它与二进制浮点数的本质有关。 你不能用float准确地表示所有有理数。例如,您可能会尝试比较0.1 + 0.2 == 0.3,它将失败,因为0.3没有准确表示。