math.floordiv 是 java 8 引入的向下取整除法方法,与传统 / 运算符在负数时行为不同:/ 向零截断,floordiv 向负无穷舍入;它适用于索引计算等需结果≤实际商的场景,且为纯整数运算,避免 double 精度问题。

Math.floorDiv 是 Java 8 引入的静态方法,专门用于做“向下取整除法”,即结果向负无穷方向舍入(不是向零截断)。它和传统的 / 运算符在处理**负数时行为不同**,这是关键区别。
和普通除法 / 的区别
Java 中整数除法 a / b 是“向零截断”(truncation toward zero):
- 7 / 3 → 2
- -7 / 3 → -2(不是 -3)
而 Math.floorDiv(a, b) 是“向下取整”(floor division):
- Math.floorDiv(7, 3) → 2
- Math.floorDiv(-7, 3) → -3(因为 -7 ÷ 3 ≈ -2.33…,向下取整是 -3)
- Math.floorDiv(7, -3) → -3(7 ÷ -3 ≈ -2.33…,向下取整仍是 -3)
- Math.floorDiv(-7, -3) → 2(-7 ÷ -3 ≈ 2.33…,向下取整是 2)
为什么需要 Math.floorDiv
在涉及索引计算、分页、数组分块等场景中,常需保证结果始终 ≤ 实际商。例如:
- 把 -10 个元素按每组 3 个分组,应有 ⌊-10/3⌋ = -4 组(而不是 -3);
- 计算坐标网格中的行号:row = Math.floorDiv(y, cellHeight),能确保负坐标也正确归入下一行。
使用注意事项
- 参数类型必须是
int或long,对应重载方法:floorDiv(int, int)和floorDiv(long, long) - 除零会抛出
ArithmeticException,和/一样,需自行检查 - 结果满足恒等式:
Math.floorDiv(a, b) * b + Math.floorMod(a, b) == a,其中Math.floorMod是配套的取模方法(也向下取整),不同于% - 不要用它替代
(int)Math.floor((double)a / b)—— 后者在大数值时可能因 double 精度丢失出错,floorDiv是纯整数运算,安全可靠
简单例子对比
运行以下代码可直观看到差异:
System.out.println( -7 / 3 ); // -2 System.out.println( Math.floorDiv(-7, 3) ); // -3 System.out.println( -7 % 3 ); // -1 System.out.println( Math.floorMod(-7, 3) ); // 2(因为 -7 = (-3)*3 + 2)
注意:Math.floorMod 总返回非负余数(当除数为正时),这和数学上标准的模运算一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











