Java中float数据类型加法运算未输出预期正确值问题求助
float类型加法精度误差问题解决方案
问题根本原因
你遇到的是二进制浮点数固有精度缺陷导致的计算结果偏差:float是单精度二进制浮点数,计算机底层仅能使用二进制规则存储数值,绝大多数十进制有限小数(例如0.6、24.6)本身无法被表示为长度有限的二进制浮点数,只能存储接近目标值的近似值,运算后误差累积就会出现24.599998这类不符合预期的输出。即便去掉f后缀改用double双精度浮点数,也只是缩小误差范围,无法从根本上避免该问题。
符合要求的解决方案(无四舍五入)
如果需要不做四舍五入得到精确的24.6结果,只能使用十进制精确数值类型完成计算:
- 不同编程语言均提供了对应的十进制精度类型,例如Python的
decimal.Decimal、Java的java.math.BigDecimal、C#的decimal、JavaScript的big.js等,这类类型基于十进制规则存储和运算,不会出现二进制浮点数的精度误差,可以直接得到精确的24.6计算结果。
如果仅需要在展示环节输出24.6效果,不需要修改计算逻辑,可以直接指定输出格式化规则,例如设置保留1位小数输出,不需要额外做四舍五入处理即可得到符合预期的显示效果。
注意:不存在直接修改二进制浮点数(float、double)存储逻辑就能得到精确
24.6的方案,因为24.6本身无法被二进制浮点数精确表示。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

