取模计算器

余数(a mod b)
下一步

取模(或称“mod“)运算返回整数除法后的余数:17 mod 5 = 2,因为 17 = 3·5 + 2。它是时钟算术、密码学、哈希函数以及 SQL 中“每隔第 N 行“模式的核心。本计算器接受整数或小数操作数,明确显示商与余数,并处理各语言之间符号约定的差异(负数时 Python 的 % ≠ C 的 %)。

如何计算 a mod b

  1. 1

    输入被除数 (a) 与除数 (b)

    任意数字均可;支持小数和负数。

  2. 2

    选择符号约定

    截断除法(C、Java、Go),向下取整除法(Python、Ruby、数学约定)。

  3. 3

    读取商与余数

    a = q·b + r,r 的符号由所选规则决定。

  4. 4

    查看数学表达式

    代入数值后,每一步都清晰可见。

负数的两种约定

对于正操作数,所有约定一致:17 mod 5 = 2。对于负数,各语言有所不同:

语言 -17 mod 5 约定
Python、Ruby 3 向下取整
C、Java、Go、JS -2 截断
数学教科书 3 向下取整(通常)

向下取整除法: 商向 −∞ 方向取整。余数始终与除数同号:与 b 同号。 截断除法: 商向零方向取整。余数与被除数同号:与 a 同号。

a = -17b = 5 时:

  • 截断: q = -3(向 0 取整),r = -17 − (-3)·5 = -2。
  • 向下取整: q = -4(向 -∞ 取整),r = -17 − (-4)·5 = 3。

在各自的约定下两者都正确。请选择与你的语言相符的方式。

取模的应用场景

  • 时间。 一小时中的分钟、一周中的天数、一天中的秒数,都是取模算术。
  • 哈希表。 hash(key) mod table_size 选择一个桶。
  • 轮询调度。 task_i mod worker_count 分配任务。
  • 密码学。 RSA 和 Diffie-Hellman 建立在使用超大素数的 mod n 之上。
  • 每隔第 N 行。 在 SQL 中:WHERE id % 3 = 0
  • 奇偶校验。 n mod 2 == 0 表示偶数。
  • 交替图案。 行条纹,每隔一项着色。
  • 环形缓冲区。 (index + 1) mod size 会绕回起点。

有用的恒等式

  • (a + b) mod n = ((a mod n) + (b mod n)) mod n
  • (a · b) mod n = ((a mod n) · (b mod n)) mod n
  • (a^k) mod n 可通过快速模幂在 O(log k) 时间内算出,对大数密码学至关重要。
  • 对任意整数 a,a mod 1 = 0
  • a mod a = 0

小数取模

对于实数,自然定义为 a mod b = a − b · floor(a/b)7.5 mod 2.5 = 0,因为 7.5 是精确倍数。7.6 mod 2.5 = 0.1

JavaScript 的 % 运算符适用于实数;Python 的 fmod 执行截断式实数取模;Python 的 % 执行向下取整式实数取模。

计算示例

  • 100 mod 7:100 = 14·7 + 2,因此余数为 2
  • 25 mod 4:25 = 6·4 + 1,因此余数为 1
  • -10 mod 3(向下取整):-10 = -4·3 + 2,余数 2。(截断则得 -1。)
  • 17.5 mod 5:17.5 = 3·5 + 2.5,余数 2.5

常见问题

大多数情况下二者是同义词。正式而言,“modulo”通常指数学约定(向下取整),而“remainder“(余数)通常指截断变体(C 风格)。这些名称会渗入各语言的文档;当区别重要时,请明确注明所用约定。

Python 遵循数学约定(向下取整),使余数符号与除数一致;C 遵循硬件 ALU 约定(截断),使余数符号与被除数一致。两者都不算错,只是不同的选择。

不能,除以零没有定义。当 b = 0 时,计算器会返回错误。

通常相同。请查阅你所用语言关于负数处理的规范,Python 和 Ruby 与 C、Java、Go 和 JavaScript 不同。

对于使用 2048 位数字的 RSA 式运算,请使用专用库(Python 的 pow(a, b, n)、Java 的 BigInteger.modPow)。本计算器处理日常数值,而非密码学级别的数值。

相关工具

此工具还提供其他语言版本