bigdecimal.divideandremainder返回含两个bigdecimal元素的数组:首元素为向下取整的商,次元素为余数,满足被除数=除数×商+余数且0≤余数

BigDecimal.divideAndRemainder 返回一个包含两个 BigDecimal 元素的数组:第一个是商(整数部分,向下取整),第二个是余数。它不进行四舍五入,而是按数学定义计算——满足:被除数 = 除数 × 商 + 余数,且 0 ≤ 余数 (余数非负、绝对值小于除数绝对值)。
商是向下取整的整数商
该方法只保留整数部分,舍去小数(类似 Math.floorDiv 对整数的操作),不是四舍五入,也不是截断小数位。例如:
-
new BigDecimal("10").divideAndRemainder(new BigDecimal("3"))→ 商为3,余数为1 -
new BigDecimal("7.5").divideAndRemainder(new BigDecimal("2"))→ 商为3(不是 3.75 或 4),余数为1.5 -
new BigDecimal("-10").divideAndRemainder(new BigDecimal("3"))→ 商为-4(因为 -4×3 = -12,余数为 2,满足 -10 = -4×3 + 2 且 0≤2
余数永远是非负数且小于除数绝对值
这是关键规则:余数 ≥ 0,且严格小于除数的绝对值。因此商会自动调整(向负无穷取整),确保余数落在 [0, |divisor|) 区间内。
- 正数除正数:常规理解,如 17 ÷ 5 → 商 3,余 2
- 负数除正数:-17 ÷ 5 → 商 -4(不是 -3),因为 -4×5 = -20,余数 = -17 - (-20) = 3(满足 0 ≤ 3
- 正数除负数:17 ÷ (-5) → 商 -4(不是 -3),余数 = 17 - (-4)×(-5) = 17 - 20 = -3?不对!实际结果余数仍为非负,所以 Java 会统一用除数的绝对值约束余数,即余数 ∈ [0, 5),因此商仍是 -4,余数是 3(注意:此时余数符号与被除数无关,只看大小)
使用时需注意精度和 scale
输入的 BigDecimal 若含小数位,结果中的商和余数会保持对应精度,但商一定是整数(scale=0),余数的 scale 与被除数一致(或按运算规则对齐)。
- 若被除数 scale 为 2(如 "12.34"),除数为 "1.5"(scale=1),内部会先统一 scale 再计算,余数结果 scale 通常为两者较大者
- 商总是整数,其 scale 固定为 0;余数可能含小数,但值严格满足数学定义
- 避免使用无限小数(如 1/3)作除数,否则可能抛
ArithmeticException(除非指定 rounding mode,但divideAndRemainder不接受 rounding 参数)
简单调用示例
直接调用即可,无需额外参数:
BigDecimal[] result = new BigDecimal("25").divideAndRemainder(new BigDecimal("7"));
BigDecimal quotient = result[0]; // 3
BigDecimal remainder = result[1]; // 4
也可链式解构(Java 16+ 可用模式匹配,但通常直接索引更清晰)。
不复杂但容易忽略余数非负这一设计逻辑,尤其处理负数时务必验证结果是否符合预期等式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











