标签: 取模

为什么负数取余操作(%)在c和python下结果不同

最近在用python,偶尔有一次涉及到了负数取余操作: -3 % 4

按照之前写c/c++、java的习惯,这里肯定是等于-3。但是python下返回的结果竟然是1

为什么会有不同的表现呢?先从取余操作本身说起:

 

关于取余(modulo operation)

取余的定义

由于不同的架构有不同的数字表示法和运算法,因此他们对于取余的定义也有可能略有不同。

一般来说,公认的取余操作(被除数a、除数n、商q以及余数rn % a = r)需要满足以下三条:

\begin{align}<br /><br /> q \,&\in \mathbb{Z} \\<br /><br /> a \,&= n q + r \\<br /><br /> |r| \,&< |n|.<br /><br /> \end{align}

然而这个定义是非常宽泛的。以 -3 % 4为例:

-3既可以表示为:-3 = 4 * -1 + 1

也可以表示为:-3 = 4 * 0 + (-3)

这两种表示法分别对应了两种实现方法:Truncated Division及 Floored Division。两种实现方法的求商方式不同,导致其最终结果也不同。 阅读详细 »