模运算的计算原理是这样的:
假设想求的a = x%y,a的值是通过如下公式算出来的:
a = x - (x/y)*y,且除法是按照整数除法来运算的困桥
所以将你的数字代入公式:
-17%10 = -17 - (-17/10)*10 = -17 - (-2)*10 = 3.
产生这个结果的关键在于程序的取模公式,保证了
y是正数,模运算的结果就是[0,y),
y是负数,模运算的结果就是(y,0]
通常帆尺中人们希望整除的商和余数会有这样的特性:
1. 被除数 = 除数*商 + 余数
2. 被除数符号变化,商的符号也变化,而绝对值不变
3. 余数的符号和除数相同
但实际上这 3 条不能总是符合的,第 1 条是肯定要符合的。
举例来说,3/2 为 1,3%2 为 1,如果要符合第 2 条,那就是 -3/2 为 -1,-3%2 为 -1,它是不符合第 3 条的;而如果要符合第 3 条,则是 -3%2 为 1,-3/2 为 -2,它是不符合第二条的。
所以一般编程语言会在第 2 或者 第 3 条中选择一条,python 选择的就是满足第 3 条的方式。很多其它的语态山言选择的是第 2 条。所以在 python 中,-17%10 为 3,而 -17/10 为 -2
注,在 python 3 中 / 表示除法,不表示整除,所以 -17/10 在 python 3 中为 -1.7,两个 / 才表示整除: -17//10 为 -2
这个问题在《C语言陷阱和缺陷》中有说明。