Math.floorMod 是 Java 8 引入的向下取整模运算方法,确保结果恒在 [0, |divisor|) 区间内;与 % 不同,它对负被除数返回非负余数,适用于数组索引等需非负模的场景。

Math.floorMod 是 Java 8 引入的静态方法,用于计算“向下取整模”(floor modulus),它和传统的 % 运算符在**被除数为负数时行为不同**,核心目标是让结果始终落在 [0, |divisor|) 区间内(即非负且小于除数的绝对值)。
为什么需要 floorMod?
Java 中 % 是“截断除法余数”(truncating remainder):它先做向零截断的除法,再求余。这导致负数取模结果可能为负,比如:
-
-7 % 3得-1(因为-7 / 3 == -2,余数 =-7 - (-2)*3 == -1) - 但很多数学场景(如数组索引、周期性计算)希望余数始终 ≥ 0,比如
-7对3的“循环位置”应是2(因为-7 + 9 = 2,而9是3的倍数)
Math.floorMod(a, b) 就是为解决这个问题设计的:它基于向下取整除法(floor division),确保结果恒为非负。
floorMod 的计算逻辑
公式为:Math.floorMod(a, b) == a - b * floor(a / b)
其中 floor(x) 表示不大于 x 的最大整数(即向下取整)。
实际使用时不用手动算 floor,只需记住关键规则:
立即学习“Java免费学习笔记(深入)”;
- 如果
a >= 0,且b > 0,则Math.floorMod(a, b) == a % b(和普通取模一致) - 如果
a ,结果 = <code>a % b + b(若a % b为负),再对b取模确保范围 - 更稳妥写法:
(a % b + Math.abs(b)) % Math.abs(b)—— 这等价于floorMod对正/负b的通用模拟
例如:
-
Math.floorMod(-7, 3)→-7 - 3 * floor(-7/3)→floor(-2.33...) == -3→-7 - 3*(-3) == 2 -
Math.floorMod(7, -3)→ 结果为-2(注意:除数为负时,结果符号与除数一致,范围是[-|b|+1, 0];但通常建议除数用正数)
典型使用场景
主要用在需要“安全索引”或“循环偏移”的地方:
-
数组循环访问:索引可能为负,用
Math.floorMod(index, array.length)确保合法下标 -
角度归一化:把任意角度转为
[0, 360)或[0, 2π)范围,如Math.floorMod(angle, 360) -
哈希槽映射:当哈希值可能为负时,避免
%产生负槽号
注意事项
使用前需留意:
-
b不能为 0,否则抛ArithmeticException - 除数
b为负时,结果范围是[b+1, 0](如Math.floorMod(5, -3) == -1),日常建议统一用正除数 - 性能略低于
%(因涉及浮点除法和 floor 计算),但差异极小,可忽略
不复杂但容易忽略细节。


















