Google Sheets中<=小于等于运算符计算结果错误原因咨询
现象产生的核心原因
这不是<=运算符的逻辑bug,是所有遵循IEEE 754双精度浮点数存储规则的计算工具(包括Google Sheets、Excel、绝大多数编程语言的默认数值计算)共有的精度限制问题:二进制浮点数无法精确表示所有十进制小数,计算过程中会产生量级极小的舍入误差。
具体逻辑拆解
- 你预期
(1.36*100/1.36)的计算结果是精确值100,减100后等于0,因此0<=0返回TRUE。但实际上十进制的1.36无法被二进制浮点数精确存储,乘除运算过程中会累计舍入误差,最终(1.36*100/1.36)的实际计算值是略小于100的近似值(约为99.999999999999986),减100后得到的是量级约为-1.4e-14的极小负数,因此0<=极小负数的判断结果自然为FALSE。 1.26对应的公式能返回TRUE只是巧合:1.26同样无法被二进制浮点数精确表示,但它的乘除运算过程中舍入误差的累计方向为正,或者误差刚好抵消,最终计算结果要么恰好等于100,要么略大于100,减100后的值≥0,因此判断返回正确结果,不代表这个计算过程不存在精度误差。
验证&规避方法
- 验证方式:单独在单元格输入
=(1.36*100/1.36)-100,将单元格数字格式调整为显示15位以上小数,就能直接看到计算结果不是0,而是一个极小的负数。 - 规避方案:涉及小数的大小、相等判断时,不要直接和精确值做对比,要预留合理的精度容差,比如用
ROUND函数把计算结果保留到业务需要的小数位后再比较,例如将公式改写为0<=ROUND((1.36*100/1.36)-100, 9),即可返回预期结果。
内容的提问来源于stack exchange,提问作者Yuliia Ashomok
相关产品推荐
相关产品推荐

