模運算的計算原理是這樣的:?
假設想求的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語言陷阱和缺陷》中有說明。