Python模数与余数相同?

标签 python modulo

在 Python 文档中它说“The % (modulo) operator yields the remainder from the division of the first argument by the second.

如此给定

a % b

据我所知,余数是 A 除以 B 所剩的数。所以 21 % 3 = 0,-25 % 23 = -2。 我不明白的是当 A 为负数时会发生什么。

例如,

-23 % 22

会产生

21

第一个以 -1 为模的正整数。但是 -1 是 -23 % 22 的余数。那么文档有错吗? Python 中的模运算符 % 不会产生 a % b 中的余数,而是产生与 B 一致模的第一个正整数?我很困惑。

最佳答案

有三种不同的明显方式来定义负数的整数除法,以及三种相应的方式来定义余数:

  • 底除法,其中商取负无穷大,余数与除数的符号相同。
  • 截断除法,其中商被截断为零,余数与被除数的符号相同。
  • 欧几里得除法,其中商在余数为正的任何方向上被截断。

所有这三个都保留了整数除法的基本定律:

dividend = divisor * quotient + remainder

所以,这三个都没有“对”或“错”。*

当然,这并不能阻止人们进行圣战。 Knuth 认为底除法是“数学上正确的”。 Wirth 主张截断除法,因为它“不那么令人惊讶”。 Raymond Boute 认为整数除法是根据欧几里德算法定义的。我不会试图通过争论他们三个人,包括该领域最重要的两个人,都错了来解决一场长达数十年的圣战……

一些语言通过具有两个不同的函数来解决这个问题。**

假设 Python 采纳了 Knuth 的定义,因此其模运算符具有除数的符号。


* 当然,选择商和余数的不匹配定义是另一回事。或者,更糟糕的是,指定一个而让另一个实现定义,就像 C99 之前的 C 所做的那样。

** 这特别有趣,因为它们对于哪个是哪个并不总是一致。至少当它们被称为 remmod 时,rem 是与 div 一起使用的,而 mod 是 floored 或 Euclidean 中不符合 div 的那个,当它们被称为 remremainder 时或 modmodulo...

关于Python模数与余数相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19285497/

相关文章:

c - 带负数的模运算

c++递归大数以查找mod

javascript - 使用 mod 来计算哪一行被点击了?

modulo - 使用分数的模算术

Python:查找但不包含字母数字的正则表达式

python - 如何配置 pip 以使用可编辑安装来满足要求

python - 如何在 odoo 中将 Onchange 与日期字段一起使用?

c++ - C++ 中有整数 fmod 函数吗?

python - 这个 DeprecationWarning ("callable is None") 是怎么回事?

python - Keras Flatten Conv3D ValueError Flatten 的输入形状未完全定义