BigDecimal.divideAndRemainder()一次性返回商和余数两个BigDecimal对象,商按向零截断(无舍入),余数满足dividend = quotient×divisor + remainder,避免重复计算与舍入不一致。

BigDecimal.divideAndRemainder() 是 BigDecimal 提供的专用方法,能**一次性返回商和余数两个 BigDecimal 对象**,避免手动调用 divide() 和 remainder() 两次计算、两次舍入(尤其重要),也规避了商余不一致的风险(比如除不尽时,不同舍入模式可能导致 quotient × divisor + remainder ≠ dividend)。
基本用法:直接获取商与余数数组
该方法签名是:public BigDecimal[] divideAndRemainder(BigDecimal divisor)
它返回一个长度为 2 的 BigDecimal[] 数组:
- result[0] 是**商(quotient)**,等价于 divide(divisor, RoundingMode.DOWN)(即向零截断,无舍入);
- result[1] 是**余数(remainder)**,满足恒等式:dividend.equals(result[0].multiply(divisor).add(result[1]))
✅ 关键点:
- 不接受 MathContext 或舍入模式参数 —— 商始终按 向零截断(DOWN for positive, UP for negative) 计算,确保商余严格满足数学定义;
- 要求 divisor != 0,否则抛 ArithmeticException;
- 商和余数都保留精确值(无精度损失),适合整数型大数运算场景(如金融分账、ID 拆解、模幂预处理等)。
典型使用示例
假设你要把 123456789012345.67 元按每份 1000 元分配,求总份数和剩余零头:
BigDecimal total = new BigDecimal("123456789012345.67");
BigDecimal unit = new BigDecimal("1000");
BigDecimal[] qr = total.divideAndRemainder(unit);
<p>BigDecimal quotient = qr[0]; // 123456789012
BigDecimal remainder = qr[1]; // 345.67</p><p>System.out.println("可分 " + quotient + " 份,剩 " + remainder + " 元");
// 输出:可分 123456789012 份,剩 345.67 元</p>注意:虽然 total 有小数位,但只要 unit 能整除其小数部分(或你接受小数余数),该方法仍适用。若只处理整数,建议先用 setScale(0, RoundingMode.UNNECESSARY) 校验无小数。
与 divide() + remainder() 对比:为什么推荐用它
- 手动组合易出错:若对同一被除数/除数分别调
divide(..., HALF_UP)和remainder(),商已舍入,余数不再匹配,恒等式失效; - 性能更优:一次内部计算完成,避免重复解析和中间对象创建;
- 语义明确:名字直指用途,代码可读性高,表明你确实需要“商余对”而非单独结果。
注意事项与边界情况
- 商永远是“截断商”,不是四舍五入商 —— 如
new BigDecimal("7").divideAndRemainder(new BigDecimal("3"))返回[2, 1](不是 [3, -2]); - 负数行为遵循 Java 整数除法规则:
q = trunc(dividend / divisor),r = dividend − q × divisor,余数符号与被除数一致; - 若需带指定精度的商(如保留 2 位小数),不能用此方法 —— 它只返回精确整数商,此时应改用
divide(..., scale, roundingMode)单独计算,并另行求余(但要小心一致性)。


















