BigDecimal.multiply()是高精度乘法核心方法,需用字符串构造避免精度丢失,默认小数位数为两操作数之和,可借MathContext或setScale控制精度,且每次调用返回新对象。

Java 中 BigDecimal.multiply() 是做高精度乘法的核心方法,它能避免 double/float 的精度丢失问题,特别适合金融、计费、科学计算等对结果严格准确的场景。关键不是“能不能算”,而是“怎么算得既准又可控”。
用字符串构造,避开浮点陷阱
别直接用 double 构造 BigDecimal,否则原始精度已失真:
- ❌ 错误写法:
new BigDecimal(0.1)→ 实际是0.10000000000000000555... - ✅ 正确写法:
new BigDecimal("0.1")→ 精确表示 0.1 - 推荐用
BigDecimal.valueOf(double)(内部转 String),比直接传 double 更安全
乘法结果的小数位数规则
默认情况下,a.multiply(b) 的小数位数 = a 的小数位数 + b 的小数位数:
-
new BigDecimal("2.5").multiply(new BigDecimal("3.0"))→ 结果是"7.50"(1 + 1 = 2 位小数) -
new BigDecimal("1.23").multiply(new BigDecimal("4.5"))→ 结果是"5.535"(2 + 1 = 3 位小数) - 这个规则是确定性的,不四舍五入,也不截断
控制精度:MathContext 或 setScale
如果需要限定有效数字位数或固定小数位数,有两种主流方式:
立即学习“Java免费学习笔记(深入)”;
-
按有效数字控制:用
multiply(BigDecimal, MathContext)
例如:new BigDecimal("1.23456789").multiply(new BigDecimal("2.3456789"), new MathContext(5, RoundingMode.HALF_UP))→ 得"2.8934"(5 位有效数字) -
按小数位数控制:先乘再调
setScale(scale, RoundingMode)
例如:bd1.multiply(bd2).setScale(2, RoundingMode.HALF_UP)→ 强制保留 2 位小数,四舍五入 - 注意:不指定舍入规则且结果无法精确表示时(如无限小数),会抛
ArithmeticException
不可变性与链式调用
每次 multiply() 都返回新对象,原值不变,适合函数式风格:
BigDecimal price = new BigDecimal("19.99");BigDecimal total = price.multiply(new BigDecimal("3")).setScale(2, RoundingMode.HALF_UP);- 这样写清晰、安全,也便于组合其他操作(如加税、打折)


















