You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中double类型除法精度异常原因及精确值存储方案问询

Java double类型运算精度异常问题说明

问题产生原因

double属于符合IEEE 754标准的双精度浮点数,本质通过二进制分数的幂次来存储十进制数值,大部分十进制有限小数无法用二进制有限表示,存储时会做截断处理,本身就存在固有精度误差。
示例中出现的两种结果差异是误差累积和运算特性共同导致的:0.39281转成double存储时就不是精确值,多次累加会放大误差;除以2属于二进制位的移位操作,累积的误差刚好落在十进制打印的舍入范围内,所以输出符合预期;累加3次后误差已经放大到超过打印舍入阈值,且除以3的运算无法抵消已有误差,最终就会输出带多余尾数位的结果。

精确数值存储的解决方案

如果业务要求数值存储、运算全程精确,可采用以下方案:

  • 首选java.math.BigDecimal类完成数值存储与运算:初始化时必须传入String类型的数值,不要直接传入double值避免带入固有误差,运算时调用类内置的add()、multiply()、divide()等方法,可自定义保留精度和舍入规则,完全满足精确计算需求。
  • 固定精度场景可采用整数放大方案:如果业务数值的小数位固定(比如最多4位小数、金额类仅2位小数),可将数值统一放大10^N倍转成long类型整数存储运算,所有计算都使用无精度损失的整数运算,最终展示时再缩小对应倍数即可,性能优于BigDecimal。
  • 禁止用double/float存储高精度要求数值:金额、计量统计等对精度敏感的场景,天生不适合使用浮点数类型。

内容的提问来源于stack exchange,提问作者Matthew Qian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 14:24:03