java中%运算符对负数取余时结果符号与被除数相同,因遵循向零截断除法,满足a==(a/b)*b+(a%b);为得非负余数可用(a%b+b)%b,如(-7%5+5)%5得3。

Java 中的 % 运算符对负数取余时,结果的符号与**被除数(左操作数)相同**,而不是与除数(右操作数)一致。这是 Java 遵循的“向零截断”除法规则所决定的。
核心规则:余数符号跟随被除数
Java 的 a % b 满足恒等式:
a == (a / b) * b + (a % b),其中 a / b 是向零取整的整数除法(即截断小数部分,不向下取整)。
这意味着:
- 若 a > 0,则 a % b ≥ 0(即使 b 是负数)
- 若 a ,则 a % b ≤ 0(即使 b 是正数)
- 结果的绝对值一定小于 |b|(即满足数学上对余数大小的基本要求)
常见情况举例
正数 % 负数:7 % -3 → 1(因为 7 / -3 == -2,而 (-2) * (-3) + 1 == 7)
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
负数 % 正数:-7 % 3 → -1(因为 -7 / 3 == -2,而 (-2) * 3 + (-1) == -7)
负数 % 负数:-7 % -3 → -1(因为 -7 / -3 == 2,而 2 * (-3) + (-1) == -7)
和 Python 等语言的区别
Python 的 % 是“向下取整除法”(floor division),余数始终 ≥ 0(当除数为正时)。例如:-7 % 3 在 Python 中是 2,而在 Java 中是 -1。
这种差异容易引发跨语言移植 bug,需特别注意。
需要非负余数时怎么办
如果业务逻辑要求余数必须是非负的(比如数组索引、哈希桶计算),可以手动校正:
- 通用写法:
((a % b) + Math.abs(b)) % Math.abs(b) - 当 b > 0 时更简洁:
(a % b + b) % b - 示例:
int idx = (-7 % 5 + 5) % 5;→ 得到 3,适合做合法数组下标
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










