为什么该变量计算结果为负数而非预期的0?
问题根因
你提供的算式34 - 64 * 0.4 - 7 * 1.2在理想的十进制精确计算下结果确实为0,实际返回负数是二进制浮点数精度误差导致的:
- 0.4、1.2这类十进制小数无法被二进制浮点数(绝大多数编程语言默认的浮点数存储方案)精确表示,存入内存时就会产生微小的舍入偏差
- 多步乘法、减法运算过程中,偏差会持续累积,最终得到的结果不是精确的0,而是一个绝对值极小的负数(通常为10的负14到负16次方量级),视觉上表现为不符合预期的负数
修复方案
- 若业务允许微小误差,可判断计算结果的绝对值是否小于
1e-9这类极小阈值,满足条件即视为结果等于0 - 对精度要求高的场景,使用对应编程语言的十进制精确运算工具(例如Python的
decimal库、Java的BigDecimal类)替代默认浮点数运算 - 也可先将所有数值放大为整数完成运算,再缩小回原量级,从根源上规避小数运算的精度损失


内容的提问来源于stack exchange,提问作者Luigi Aurilio
相关产品推荐
相关产品推荐

