此处的摘要:
$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
谁能告诉我如何解决它?
答案 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没有准确表示。