有人如果在python上使用
%
运算,肯定会遇到这样的问题,就是它在负数上的结果和我们之前在C或JAVA上的结果不一样。比如:
-6 % 5
这个运算,在python中的结果是
4
,但是在C/JAVA上的结果是
-1
这是为什么呢?wiki百科的解释很好,英文好的可以去看看,这里做一个简单的搬运:
取模运算
所谓取模运算在数学上就是通过辗转相除法得到的余数,一般满足下面这个式子:

所以,
r = a - nq
,而q的计算历史上出了2个分支:
truncate
这派的思想很简单,就是截去小数部分。

比如3/2 = 1 , -3/2 = -1
简单,粗暴。
floor
floor是
Donald Knuth大神提出来的,它的意思是像下取整。这个就有意思了,因为在正数的时候和truncate一样,但是在负数的时候,向下取整就会出现和truncate不一样的结果。

比如:3/2 = 1 -3/2 = -2
其他
当然还有其他的一些人提出的一些别的方案,但是都大同小异,有些要确保r为正,有些在正数和负数的时候做不同的操作……
运用
C
C还有JAVA使用的truncate的方法,所以在计算-6 % 5 的时候是这么算的:
-6 - (5*trunc(-6/5))= -6 - (5 * -1) = -1
python
python使用的floor除法的方式
-6 - (5*floor(-6/5))= -6 - (5 * -2) = 4
结论
反正,在取模运算上,
基本不同的语言都有自己的一套机制,一般来说,这套机制在
正数上都一样,所以为了避免出现不必要的问题,
建议先把负数转成正数再做取模运算。