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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:24:01