BigDecimal.divideAndRemainder() 返回商与余数数组,商向下取整、scale同被除数,余数绝对值小于除数且符号同被除数;要求整除或余数可精确表示,否则抛ArithmeticException。

BigDecimal.divideAndRemainder() 是 Java 中用于高精度除法并同时获取商与余数的便捷方法,适用于需要精确计算且不能容忍浮点误差的场景(如金融计算)。它返回一个包含两个 BigDecimal 元素的数组:索引 0 是商,索引 1 是余数,满足数学恒等式:dividend = divisor × quotient + remainder。
基本用法与返回值含义
该方法签名如下:
public BigDecimal[] divideAndRemainder(BigDecimal divisor)
调用时需确保 divisor 非零(否则抛出 ArithmeticException),且不指定舍入模式——这意味着它仅在能整除或余数可精确表示时才安全使用。返回数组中:
立即学习“Java免费学习笔记(深入)”;
-
result[0]:向下取整(朝零方向)的商,类型为
BigDecimal,其标度(scale)与被除数一致; -
result[1]:余数,满足
remainder.abs() < divisor.abs(),且符号与被除数相同。
必须注意的精度与异常条件
该方法不接受 MathContext 或舍入参数,因此有严格前提:
- 若除法结果无法用有限小数表示(例如
1.0.divideAndRemainder(new BigDecimal("3"))),会抛出ArithmeticException; - 被除数和除数的小数位数会影响是否可精确整除,建议统一 scale 或先用
setScale()规范精度; - 商的 scale 始终等于被除数的 scale,余数的 scale 等于被除数的 scale(不会自动适配除数)。
实用示例:安全调用与结果解析
以下代码演示典型用法及常见处理方式:
BigDecimal a = new BigDecimal("17.5");
BigDecimal b = new BigDecimal("4");
try {
BigDecimal[] result = a.divideAndRemainder(b);
BigDecimal quotient = result[0]; // 4
BigDecimal remainder = result[1]; // 1.5
System.out.println("商:" + quotient); // 输出:4
System.out.println("余数:" + remainder); // 输出:1.5
} catch (ArithmeticException e) {
System.err.println("无法精确计算商和余数:" + e.getMessage());
}
若涉及更复杂小数(如 "10.1" ÷ "3.0"),推荐先转为整数运算:将两数同乘 10 的幂次,转化为整数除法后再还原 scale。
替代方案:当 divideAndRemainder 不适用时
若存在无限小数或需自定义舍入行为,应改用组合操作:
- 用
divide(divisor, scale, roundingMode)得商; - 再用
subtract(quotient.multiply(divisor))手动算余数; - 注意保持 scale 一致,避免中间结果精度丢失。
这种方式虽稍繁琐,但可控性强,适合非整除场景。


















