因此,在使用PHP进行编程时,我们发现了一些奇怪的事情。
我们从数据库中提取数字,并将结果设置为正常。
然后我们来评估if语句中的结果以及是否像这样
if(abs($number1 + $number2) < .05){
// do that
}else{
// do that
}
当我们打印abs($number1 + $number2)
的输出时,它显示.05
的结果,所以逻辑上我们的if语句应该已执行的else部分,但它将.05 < .05
评估为true
}。为什么呢?
答案 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";
}