PHP简单加法运算相等判断返回错误原因求解
问题原因
这是二进制浮点数精度丢失导致的通用问题,所有遵循IEEE 754浮点数标准的编程语言(包括PHP、Java、Python等)都存在该现象。
十进制小数转换为二进制浮点数时,大部分非整数都无法被精确存储,只会保存一个和真实值无限接近的近似值。10.81本身就属于无法被二进制精确表示的小数,7.00虽然可以精确表示,但二者相加后的结果仍然是近似值,和直接书写的17.81对应的近似存储值存在极微小的误差,用==做严格相等判断时就会返回false。
修复方案
- 方案1:使用PHP内置的BC高精度数学函数做运算和比较,入参统一传入字符串避免前置精度损失:
// bcadd指定保留2位小数计算和,bccomp比较两个数的大小,相等返回0 echo bccomp(bcadd('10.81', '7.00', 2), '17.81', 2) === 0 ? 'right' : 'wrong';
- 方案2:设置业务可接受的极小误差阈值,判断两个数的差值是否在阈值范围内:
// 阈值可根据业务精度要求调整,1e-6代表允许误差不超过0.000001 $allowError = 1e-6; echo abs((10.81 + 7.00) - 17.81) < $allowError ? 'right' : 'wrong';
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

