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



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

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

然后我们在if语句中评估结果,如果像这样

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

当我们打印abs($number1 + $number2)的输出时,它显示了.05的结果,所以从逻辑上讲,if语句的其他部分应该执行,但它将.05 < .05求值为true。为什么?

因为float值总是不精确。因此,0.05在内部可以很好地为0.0499999999,这小于0.05。

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

您的结果并不奇怪。使用浮点运算时,需要考虑"精度"的概念。

这篇来自PHP文档的文章说:

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

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

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

相关内容

最新更新