为什么当值相同时,<小于条件命中?[复制]

Why is < less than condition hitting when values are the same? [duplicate]

提问人:lky 提问时间:12/9/2022 最后编辑:John Kugelmanlky 更新时间:12/9/2022 访问量:47

问:

dump($available_funds);
dump($meal_price);

if ($available_funds < $meal_price) {
    dd('hit');
    return false;
}

$available_funds并且两个“双精度”值都设置为 2.78$meal_price

为什么当值相同时,语句会被命中?if

我尝试了变量并尝试更新类型,看看这是否可以解决这种情况,但没有运气。(float)floatval()

PHP 浮点

评论

1赞 John Kugelman 12/9/2022
你能创建一个最小的可重复的例子,我们可以自己运行吗?包括将两个变量初始化为失败值的代码,并向我们显示你所看到的输出。dump
0赞 Jared Farrish 12/9/2022
无法重现:3v4l.org/8BvUN
0赞 Andrew 12/10/2022
您确定它们是相同的值吗?2.78 不能完全表示为浮点数。
0赞 Andrew 12/10/2022
与 2.78 最接近的可精确表示的 64 位浮点值是 2.7799999999999999804600747665972448885440826416015625。许多其他精确表示的 64 位浮点值四舍五入为 2.78

答:

2赞 Rijad Husic 12/9/2022 #1

该问题可能是由于 double 数据类型的精度所致。双精度值最多可以有 15 位十进制数字的精度,但在某些情况下,存储的实际值可能与声明的类型不同。这在比较双精度值时可能会导致问题,因为即使它们看起来相同,这些值也可能不完全相等。

此问题的一个解决方案是使用 round() 函数将值四舍五入到特定数量的小数位,然后再进行比较。例如,可以使用以下代码将这些值与精度的小数点后两位进行比较:

$available_funds = round($available_funds, 2);
$meal_price = round($meal_price, 2);

if ($available_funds < $meal_price) {
    dd('hit');
    return false;
}

评论

0赞 Andrew 12/10/2022
在 python 中查看: print(“%6.6f\n” % (2.77999999999999999804600747665972448885440826416015625)) ==> 2.780000;print(“%6.6f\n” % (2.7799999999999999804600747665972448885440826416015625 - 1/2**22.0)) ==> 2.780000;print(“%6.6f\n” % (2.7799999999999999804600747665972448885440826416015625 + 1/2**22.0)) ==> 2.780000