为何值相等时$available_funds < $meal_price条件仍会触发?
浮点数精度导致的比较问题
这是浮点数的二进制存储精度问题引发的。像2.78这类十进制小数,转换成二进制时是无限循环的,计算机无法精确存储,只能保存近似值。虽然你看到的两个变量值都是2.78,但$available_funds和$meal_price的实际存储值可能存在细微差异——比如一个是2.7800000000000002,另一个是2.7799999999999998,这种微小差距会让$available_funds < $meal_price的判断成立。
强制转成float或使用floatval()无法解决问题,因为它们本质还是基于浮点数的近似存储,无法消除精度损失。
解决方法
四舍五入后比较:对两个数保留相同小数位数后再判断,确保比较的是直观上的数值:
if (round($available_funds, 2) < round($meal_price, 2)) { dd('hit'); return false; }使用高精度数学扩展:如果涉及金额这类对精度要求高的场景,推荐用PHP的
bcmath扩展做高精度比较:// bccomp返回1表示左>右,0表示相等,-1表示左<右,第三个参数指定小数位数 if (bccomp($available_funds, $meal_price, 2) === -1) { dd('hit'); return false; }通过误差范围判断:设定一个极小的误差阈值(比如
1e-9),若两个数的绝对差值小于该阈值,就认为它们相等:$epsilon = 1e-9; if (abs($available_funds - $meal_price) > $epsilon && $available_funds < $meal_price) { dd('hit'); return false; }
内容的提问来源于stack exchange,提问作者lky
相关产品推荐
相关产品推荐

