什么时候是.05< .05真的吗?

时间:2015-10-28 17:30:25

标签: php

因此,在使用PHP进行编程时,我们发现了一些奇怪的事情。

我们从数据库中提取数字,并将结果设置为正常。

然后我们来评估if语句中的结果以及是否像这样

if(abs($number1 + $number2) < .05){
    // do that
}else{
    // do that
}

当我们打印abs($number1 + $number2)的输出时,它显示.05的结果,所以逻辑上我们的if语句应该已执行的else部分,但它将.05 < .05评估为true }。为什么呢?

2 个答案:

答案 0 :(得分:3)

因为float值始终不准确。所以0.05内部很可能是0.0499999999,小于0.05。

使用您允许的非常小的epsilon值作为错误可以解决您的问题。

答案 1 :(得分:1)

你的结果真的不那么奇怪。使用浮动时,您需要考虑“精度”的概念。

This article from the PHP docs说:

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

本文提供了一些可以比较浮动值的示例代码:

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
        echo "true";
}