Python中怎么使用%运算符取余数

Dylan
Dylan
发布时间:2026-11-03| 5人浏览过
原创

详细解析Python中%(取模/取余)运算符的用法、底层计算公式、负数取余规则、浮点数取余细节以及奇偶判断、环形轮播、时间换算等实际开发场景。

Python中怎么使用%运算符取余数
Python基础语法 阅读时长:约 6 分钟 适用版本:Python 3.x
在Python中,取得两个数相除后的余数直接使用百分号运算符 %(也称为取模或取余运算符)。语法格式为 a % b,其中 a 是被除数,b 是除数。例如表达式 10 % 3 的计算结果为 1。与许多基于C语言规则的编程语言不同,Python的 % 运算紧密绑定其向下取整(Floor Division)整除机制,因此在处理包含负数的除法时具有独特而严谨的行为特性。

一、基础语法与核心计算公式

在Python交互式终端、脚本或Jupyter环境中,使用 % 进行整数取余是最直接的操作:

# 基础正整数取余示例
remainder1 = 10 % 3
remainder2 = 14 % 4
remainder3 = 20 % 5

print("10 % 3 =", remainder1)
print("14 % 4 =", remainder2)
print("20 % 5 =", remainder3)
示例运行输出
10 % 3 = 1
14 % 4 = 2
20 % 5 = 0

当两数能够整除时,例如 20 % 5,余数为 0。

要真正理解 % 的运算过程,必须掌握Python内部对余数的数学定义。Python官方语言规范明确定义,对于任何除数 b != 0,取模运算 a % b 与整除运算符 // 满足以下恒等式:

r = a - (a // b) * b

其中 // 表示“向下取整整除”(向负无穷大方向取整)。余数 r 实际上就是被除数 a 减去商与除数 b 的乘积。

Python中怎么使用%运算符取余数
图1:Python 中 % 运算符的底层公式推导与三步运算关系

二、计算执行步骤与零除排查

在实际编写代码使用 % 时,从代码输入到得出结果通常遵循四个明确的步骤:

  1. 确定操作数:明确左操作数(被除数)与右操作数(除数)。两者都可以是整数(int)或浮点数(float)。
  2. 前置零除检查:除数绝对不能为 0。如果右侧除数为 0,Python解释器会抛出 ZeroDivisionError: integer division or modulo by zero 异常。
  3. 执行向下取整求商:解释器先对 a / b 的结果向负无穷大方向取整得到商 q = a // b。
  4. 计算得出最终余数:代入公式 r = a - q * b,输出与除数同符号的数值。
Python中怎么使用%运算符取余数
图2:取余操作的判定流程与安全执行步骤

三、包含负数的取余规则与跨语言差异

当被除数或除数中出现负数时,初学者常常对计算结果感到困惑。例如为什么在Python中 -10 % 3 的结果是 2 而不是 -1?

# 负数参与取余的实际测试
print("-10 % 3  =", -10 % 3)
print(" 10 % -3 =", 10 % -3)
print("-10 % -3 =", -10 % -3)
示例运行输出
-10 % 3 = 2
10 % -3 = -2
-10 % -3 = -1

这一结果直接来源于底层的向下取整逻辑:

  • 计算 -10 // 3:数学商为 -3.333...。向下(向负无穷方向)取整得到 -4。因此 -10 - (-4 * 3) = -10 - (-12) = 2。
  • 计算 10 // -3:数学商为 -3.333...。向下取整同样得到 -4。因此 10 - (-4 * -3) = 10 - 12 = -2。
  • 计算 -10 // -3:数学商为 +3.333...。向下取整得到 3。因此 -10 - (3 * -3) = -10 - (-9) = -1。
核心记忆准则:在Python中,余数 r 的符号始终与除数 b 保持一致(除非余数为0)。如果除数为正,余数必然为非负数;如果除数为负,余数必然为非正数。
Python中怎么使用%运算符取余数
图3:数轴视角下的取模机制对比:Python向下取整与C语言向零截断的本质区别

四、浮点数取余与精确度问题

在Python中,% 同样支持浮点数运算。例如:

# 浮点数取余
print("7.5 % 2.5 =", 7.5 % 2.5)
print("5.5 % 2   =", 5.5 % 2)
print("5.6 % 0.8 =", 5.6 % 0.8)
示例运行输出
7.5 % 2.5 = 0.0
5.5 % 2 = 1.5
5.6 % 0.8 = 0.7999999999999998

注意到 5.6 % 0.8 的输出并不是直觉上的 0.0,而是 0.7999999999999998。这是因为计算机内部采用IEEE 754二进制浮点数表示十进制小数时存在固有微小精度截断误差。5.6 / 0.8 在底层二进制计算时实际上略小于 7.0(约为 6.999999999999999),经向下取整后得到商为 6.0,因而余数为 5.6 - 6 * 0.8 = 0.8 左右。

在涉及金钱、度量等高精度小数计算时,建议使用标准库的 decimal.Decimal 模块,或者使用 round() 进行合理的舍入。

五、四大经典实际应用场景

取余运算符不仅用于纯数学计算,在日常软件工程与算法编写中也是不可或缺的高频工具。以下是四个最典型的实战模式:

1. 奇数与偶数判断

通过对整数执行 n % 2,若余数为 0 则为偶数,若为 1 则为奇数:

def check_even_odd(number):
    if number % 2 == 0:
        return f"{number} 是偶数"
    else:
        return f"{number} 是奇数"

print(check_even_odd(42))
print(check_even_odd(17))

2. 环形轮播与周期性下标控制

在轮播图、环形队列或循环任务轮询中,索引不断递增但需要始终限制在列表长度 [0, len - 1] 范围内。通过 (current_index + 1) % len(items) 可以实现无缝回卷:

themes = ["深色模式", "浅色模式", "护眼模式"]
for click in range(5):
    active_theme = themes[click % len(themes)]
    print(f"点击第 {click + 1} 次,当前主题:{active_theme}")
示例运行输出
点击第 1 次,当前主题:深色模式
点击第 2 次,当前主题:浅色模式
点击第 3 次,当前主题:护眼模式
点击第 4 次,当前主题:深色模式
点击第 5 次,当前主题:浅色模式

3. 时间与度量衡单位拆分

将总秒数拆分为“分钟”和“剩余秒数”,或者将总天数转换为“周数”和“剩余天数”:

total_seconds = 375
minutes = total_seconds // 60
seconds = total_seconds % 60
print(f"{total_seconds}秒 相当于 {minutes}分{seconds}秒")

4. 二维网格行列坐标映射

在将一维序列渲染为多列网格布局(如九宫格、电商商品卡片布局)时,行索引与列索引通过整除和取余直接解构:

COLUMNS = 3
for index in range(6):
    row = index // COLUMNS
    col = index % COLUMNS
    print(f"元素序号 {index} ➔ 放置在 第 {row} 行,第 {col} 列")
Python中怎么使用%运算符取余数
图4:从基础判断到多维布局,取模运算在日常开发中的核心应用矩阵

六、高效实践与替代工具对比

在实际编写Python项目时,根据具体需求,除了单独使用 %,还可以配合内置函数或专门模块来获得更高效率或不同行为:

方法 / 语法 返回值类型 核心运算机制 典型推荐场景
a % b int 或 float 基于向下取整整除(Floor),余数符号与除数一致 日常取余、周期控制、奇偶检测
divmod(a, b) tuple: (商, 余数) 同时返回 (a // b, a % b) 需要同时使用商与余数的场景(如时间拆分、分页计算)
math.fmod(a, b) float 向零截断,余数符号与被除数一致(与C语言相同) 跨语言移植数值计算、严格遵照C标准库规范时
decimal.Decimal % Decimal 对象 高精度十进制定点运算,杜绝浮点微小误差 金融结算、高精度仪器数据分析

例如,若需要同时获得商和余数,推荐使用 divmod():

# divmod 同时返回商与余数
quotient, remainder = divmod(125, 60)
print(f"商 (分钟): {quotient}, 余数 (秒): {remainder}")
示例运行输出
商 (分钟): 2, 余数 (秒): 5
提示:在旧版本Python中,% 还常用于字符串格式化(例如 "Hello, %s" % name)。在现代Python编程中,建议区分二者用法:数值计算中 % 用于取余,而文本格式化推荐使用 f-string(格式化字符串字面量 f"..."),既更加清晰直观,也避免语法符号混淆。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。