
在写 Python 的过程中,整数运算是最常用、最基础的部分。
但你有没有想过,看似简单的 // 和 %,其实藏着不少“坑”?尤其当负数出现时,它们的行为常常会让人大吃一惊。
今天我们就来彻底解剖 Python 中整数运算的内部逻辑。不仅要搞清楚这些运算到底在干什么,还要搞明白它们在边界场景下的真实表现。
这不是一篇枯燥的数学笔记,而是一份程序员实用指南。尤其适合那些不想在细节上翻车的你。
Python 中的整数(int)可以做各种算术运算,比如加减乘除、取幂等,没什么悬念:
但重点来了:
没错,在 Python 中,“除法 / 总是返回浮点数”,哪怕结果看上去像个整数,比如 10 / 2 == 5.0。
这意味着:
这就是为什么 Python 又专门提供了 // 来做“真正的整除”。
让我们回到小学,假设你被要求计算:
你可能会这样做:
最终你写下答案是:
现在看懂这句了吗?
用 Python 来描述这件事,我们可以写成:
而这两个操作满足一个非常重要的公式:
我们接下来会不断用到它,它是理解整除和取余真正意义的核心钥匙。
我们正式写下这个公式,形式上是这样的:
它的含义非常重要,Python 的 // 和 % 运算符,就是为了保证这条等式永远成立,无论 a 和 b 是正是负。
换句话说:
它们的本质,是共同满足这个等式:
这也是为什么你在 Python 中看到一些“奇怪”的结果,比如 -13 % 4 == 3,但其实一点都不奇怪——我们会在接下来的内容详细讲解。
很多人以为整除就是“把小数部分截断”,比如:
于是自然而然地以为:
但实际上是:
为什么?因为 Python 的 // 运算不是做截断,而是做 floor 除法,也叫“向下取整”。
举几个例子你就明白了:
注意⚠️:当遇到负数时,floor 不是“去掉小数部分”,而是向更小的方向取整。这点非常重要。
而这,恰好是 Python 中 // 运算的数学基础。
如果你用 math.trunc 来试试,会发现差异立马就显现出来:
所以请记住:
举个例子:
你会看到:
✅ 验证成立!
来试试看你的理解是否牢固了,以下这些表达式分别会返回什么结果?
我们先回顾一下上文的小测验:
等等,最后这句 -7 % 3 == 2?你可能想说:“负七除以三不就余 -1 吗?怎么是 2?”
很多人第一次看到这个结果会一脸问号。但别忘了我们在上半部分强调的那条核心等式:
我们带着这个公式来验证:
果然成立!
所以,在 Python 中,% 运算的目标并不是简单求“余数”,而是:
关键点来了:
来看一组实验对比:
很多人第一反应是:“为啥结果带符号了?”
其实这不是 bug,而是设计决定。
Python 的 % 运算,永远让结果的符号和“除数”(也就是右边那个数)保持一致。
无一例外,全都满足核心公式 ✅
为什么 -7 // 3 == -3 而不是 -2?
我们用数轴来可视化一下,会更容易理解。
这个结果落在 -3 到 -2 之间,但因为 // 是 floor 除法,所以向下取整到 -3。
而不是简单截掉小数(那是 trunc)变成 -2!
这种行为在正数和负数之间造成了巨大差异:
所以再次强调:在 Python 中,
我们用几行代码,再次验证我们说的一切:
输出结果:
结果完美符合我们上面所说的所有规则:
结论是:
也就是说,它的使命不是“给你个你看得懂的余数”,而是:
最后稍微提一嘴浮点数。
即便是浮点数参与运算,Python 也会尽可能遵守那条“核心公式”:
但是注意!由于浮点数有精度误差,这个等式可能 近似成立 而非完全一致。
今天我们一起深入挖掘了 Python 中整数运算的底层规则:
你现在不仅不会再被 -13 % 4 == 3 这样的表达式吓到,还能向别人讲清楚这背后的数学逻辑和语言设计理念。
建议收藏本文,下次你踩在某个边界条件上出错的时候,说不定就靠它救命了。
如果你觉得这篇文章有帮助,欢迎点赞、转发、收藏!❤️
