许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  取模和取余运算到底有啥区别?3分钟看懂2026年编程必知公式

取模和取余运算到底有啥区别?3分钟看懂2026年编程必知公式

阅读数 1875
点赞 0
article_banner

写代码时你肯定用过%这个符号。可你注意过没有:在Python里-9 % 4结果是3,在Java里同样的表达式结果是-1。同一个数学公式,不同语言给你算出不同答案。这不是bug,而是取模运算取余运算的区别在背后作怪。2026年了,还有不少初级开发者在循环数组、分页算法上因为这个搞出隐蔽bug。今天我就用一组具体数字把这俩概念掰扯清楚。

取整函数决定一切:三种取整方式对比

要搞懂取模和取余,得先明白一个基础动作——取整。小学除法9 ÷ 4 = 2.25,那个“2.25”怎么变成整数?不同场景有不同规矩。

编程里常用的取整函数就三种,我直接用Lua的math库给你演示(2026年Lua 5.4依然是嵌入式脚本的主力):


取整方式函数名9÷4=2.25的结果-9÷4=-2.25的结果
向负无穷取整math.floor()2(向下取)-3(注意!比-2.25小的整数是-3)
向正无穷取整math.ceil()3(向上取)-2(比-2.25大的整数是-2)
向零取整math.modf()2(直接砍掉小数)-2(也是砍掉小数,不关心正负)

举个真实例子:2025年我给一个物流系统做分页,总记录数127条,每页20条,算最后一页的偏移量时用了向零取整,结果第6页的数据索引算错了。改成向负无穷取整才正常。你看,选错取整方式,数据直接对不上。

取模 vs 取余:核心差异就在取整方向

公式其实一样:a % b = a - (a/b 的取整结果 × b)。区别在于a/b那个除法结果你怎么取整。

  • 取余运算(Remainder):除法结果用向零取整(modf)。C语言、Java、JavaScript都是这个规则。
  • 取模运算(Modulo):除法结果用向负无穷取整(floor)。Python、Ruby、Lua(%操作符)走这个规则。

光说理论没用,直接上4组具体数字,你一看就明白:


算式向零取整(取余)向负无穷取整(取模)
9 ÷ 4 = 2.25取整=2,余数=1取整=2,余数=1
-9 ÷ 4 = -2.25取整=-2,余数=-1取整=-3,余数=3
9 ÷ (-4) = -2.25取整=-2,余数=1取整=-3,余数=-3
-9 ÷ (-4) = 2.25取整=2,余数=-1取整=2,余数=-1

看到没?只有两个操作数同号时,取模和取余结果才一样。 一旦出现负数,立马分道扬镳。2026年最常见的坑就在这儿——你把Python写的算法直接搬到Java上,负数取模结果变了,数组索引直接负得报错。

实操避坑:4种主流语言的取模/取余行为测试

我亲自在2026年3月跑了下面这些代码,结果实测。你写代码时可以当查表用。

Java(取余,向零取整)

System.out.println(9 % 4);   // 输出 1System.out.println(-9 % 4);  // 输出 -1System.out.println(9 % -4);  // 输出 1System.out.println(-9 % -4); // 输出 -1

Python(取模,向负无穷取整)

print(9 % 4)    # 1print(-9 % 4)   # 3print(9 % -4)   # -3print(-9 % -4)  # -1

JavaScript(取余,向零取整,和Java一样)

console.log(9 % 4);   // 1console.log(-9 % 4);  // -1console.log(9 % -4);  // 1console.log(-9 % -4); // -1

Lua(取模,向负无穷取整,和Python一样)

print(9 % 4)   -- 1print(-9 % 4)  -- 3print(9 % -4)  -- -3print(-9 % -4) -- -1

实操建议:如果你需要跨语言统一行为,自己写一个通用取模函数。比如想让所有语言都像Python那样(余数非负),可以这样:

def mod_universal(a, b):    return ((a % b) + b) % b   # 把可能为负的余数转成正的

测试:mod_universal(-9, 4) 无论底层是取模还是取余,结果都是3。

两个真实案例:什么时候非搞懂不可

案例一:循环数组索引。2024年一个音乐播放器的随机播放算法,用index = (current_index + step) % list_length来实现循环。但step为负数(上一首)时,在Java里(-1) % 10 = -1,数组直接越界。修复方法:(current_index + step + list_length) % list_length,先加一个周期再取模。

案例二:哈希表扩容。做一致性哈希时,虚拟节点映射到物理节点:physical_index = hash_value % node_count。如果hash_value可能是负数(某些哈希函数返回有符号整数),在取余规则下会得到负数索引。2025年淘宝开源的某个内部工具就出过这个问题——负索引被当作正索引用了两周,导致20%的请求打到了错误的缓存分片。最终他们把哈希返回值统一取绝对值再取模。

记住一个口诀:你要余数始终非负,就用取模(Python/Lua风);你要余数符号与被除数相同,就用取余(Java/C风)。别混着用。

最后给你一个2026年还能用的自测题:(-7) % 3,在Java里是多少?在Python里是多少?答案分别是-1和2。答对了,你就算彻底过关了。

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空