Java使用BigDecimal做除法运算保留60位小数且不丢失精度的实现方法
高精度除法保留60位小数的BigDecimal正确实现方案
精度丢失的核心原因
你遇到的16位之后精度丢失问题,几乎都是初始化阶段引入的错误:
- 使用
BigDecimal(double)构造方法传入浮点型数值初始化:double类型本身只有15~17位十进制有效数字的精度,赋值时就已经丢失了高位之外的信息,后续运算不可能还原准确值 - 未指定除法运算的精度参数:默认除法遇到除不尽的情况会直接抛出异常,精度设置不足也会提前截断小数位
正确实现代码
import java.math.BigDecimal; import java.math.RoundingMode; public class PrecisionDiv { public static void main(String[] args) { // 必须用字符串形式初始化两个运算数,完全规避浮点精度损失 BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("17"); // 除法参数依次为:保留小数位数、舍入模式 // 这里设置保留60位,用四舍五入模式,需要截断可替换为RoundingMode.DOWN BigDecimal res = a.divide(b, 60, RoundingMode.HALF_UP); System.out.println(res); // 输出:0.016393442622950819672131147540983606557377049180327868852459 // 与你给出的目标准确值完全一致 } }
额外注意事项
- 所有参与高精度运算的数值都要使用字符串构造BigDecimal,禁止直接传入
float、double类型的变量或字面量 - 舍入模式可按需调整:常见可选值还有
RoundingMode.UP(向远离0的方向舍入)、RoundingMode.HALF_EVEN(银行家舍入法)等
内容的提问来源于stack exchange,提问作者ParkerHarrelson123
相关产品推荐
相关产品推荐

