1. 为什么Java需要BigDecimal?
第一次用double做金额计算时,我就被0.1+0.2≠0.3的结果惊到了。当时正在开发电商结算系统,这个发现直接让我连夜重写了所有财务模块。这就是BigDecimal存在的意义——解决二进制浮点数在商业计算中的精度陷阱。
浮点数的精度问题源于IEEE 754标准的存储方式。比如0.1在二进制中是无限循环小数,就像十进制的1/3一样无法精确表示。而BigDecimal采用基于十进制的存储模型,把数值拆解为"未缩放值×10^缩放因子"的形式存储,就像用科学计数法记录十进制数,从根本上避免了二进制转换误差。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BigDecimal核心使用指南
2.1 对象创建的5种正确姿势
java复制// 1. 字符串构造(推荐首选)
BigDecimal a = new BigDecimal("0.1");
// 2. 整型构造
BigDecimal b = new BigDecimal(1);
// 3. 长整型构造
BigDecimal c = new BigDecimal(1L);
// 4. valueOf方法(内部会做缓存优化)
BigDecimal d = BigDecimal.valueOf(0.1);
// 5. 字符数组构造(特殊场景使用)
BigDecimal e = new BigDecimal(new char[]{'3','.','1','4'});
重要警示:绝对不要直接用double构造!new BigDecimal(0.1)已经注入了精度误差
2.2 四则运算的精度控制
加减乘除必须显式指定MathContext,否则可能抛出ArithmeticException:
java复制BigDecimal x = new BigDecimal("1.234");
BigDecimal y = new BigDecimal("5.678");
// 加法(保留4位小数,四舍五入)
BigDecimal sum = x.add(y, new MathContext(4, RoundingMode.HALF_UP));
// 除法(精确到小数点后10位)
BigDecimal quotient = x.divide(y, 10,
