BigDecimal.subtract()用于高精度减法,返回新对象且原对象不变;应使用字符串或valueOf()构造以避免精度损失;subtract本身不舍入,需setScale()显式处理;传入null会抛NullPointerException。

BigDecimal.subtract() 是 Java 中执行高精度减法的核心方法,它能避免 float/double 的浮点误差,适用于金融、科学计算等对精度要求严格的场景。
subtract 方法的基本用法
该方法接收一个 BigDecimal 类型参数,返回一个新的 BigDecimal 对象,表示当前对象减去参数后的结果。原始对象不会被修改(BigDecimal 是不可变的)。
示例:
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3.27");
BigDecimal result = a.subtract(b); // 结果为 7.23
System.out.println(result); // 输出:7.23
注意构造方式:别用 double 直接构造
直接用 double 值构造 BigDecimal 可能引入隐式精度损失,导致减法结果“看似正确实则不准”。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误写法:
new BigDecimal(0.1)→ 实际存储的是 0.10000000000000000555… - ✅ 正确写法:
new BigDecimal("0.1")或BigDecimal.valueOf(0.1)
推荐优先使用字符串构造,或用 valueOf()(它内部做了 double 到字符串的合理转换)。
处理精度和舍入(需要时)
subtract 本身不涉及舍入——它保留全部精确位数。但若你后续要转成固定小数位(如货币保留两位),需显式调用 setScale() 并指定舍入模式。
例如:
BigDecimal a = new BigDecimal("10.005");
BigDecimal b = new BigDecimal("2.001");
BigDecimal diff = a.subtract(b); // 8.004
BigDecimal rounded = diff.setScale(2, RoundingMode.HALF_UP); // 8.00
常见舍入模式:RoundingMode.HALF_UP(四舍五入)、RoundingMode.HALF_DOWN、RoundingMode.CEILING 等,按业务需求选择。
空值与异常处理
subtract 不接受 null 参数,传入会抛出 NullPointerException。建议在调用前做非空校验:
- 检查操作数是否为 null
- 必要时统一用
Objects.requireNonNull()或自定义默认值逻辑
另外,BigDecimal 的 scale(小数位数)不同不影响 subtract 运算,内部会自动对齐(类似数学减法的补零逻辑)。


















