因此,在使用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";
}