Python 關於整除以及負數取餘遇到的問題
阿新 • • 發佈:2018-11-03
最近在編碼的過程中,在整除以及取餘的時候遇到了一些比較迷的問題,這裡碼一下這些問題,以備日後檢視。
在Python3中,除法有 “/” 以及 “//” 兩種,這兩個有著明顯的區別,具體區別看程式碼:
print(12//10)
print(12/10)
這兩行程式碼的輸出如下:
1
1.2
這結果的差別顯而易見。當被除數是負數的時候又是令一種情況:
print(-12/10)
print(int(-12/10))
print(-13//10)
這三條語句的輸出為:
-1.2
-1
-2
這裡面就可以發現-13用 “//” 除以10的時候,結果是-2,從結果中我們可以看出,“//”是向下取整,“-1.3”會被取成-2,如果想要得到-1,就需要用“/”,然後將結果強制轉換為int型。
再講到取餘操作,比除法操作更為複雜。
正數的取餘比較直接:
print(123%10)
這裡結果為3。
但是換為負數取餘,情況就有所不同:
print(-123%10)
print(-123%-10)
7
-3
這裡面第二條是我們一般意義上的取餘操作。這裡也特別標註一下,如果涉及到負數取餘要用上述解決辦法。
那麼我們看第一條,結果等於7。這個結果有點讓人摸不到頭腦,不過這個結果與Python的底層機制有關。
在Python中,取餘的計算公式與別的語言並沒有什麼區別:r=a-n*[a//n]
這裡r是餘數,a是被除數,n是除數。
不過在“a//n”這一步,當a是負數的時候,我們上面說了,會向下取整,也就是說向負無窮方向取整。這也就得到:
-123%10 = -123 - 10 * (-123 // 10) = -123 - 10 * (-13) = 7
這裡還不得不提的是
print(123%-10)
這個情況,結果為:
-7
這個通過公式我們也能清楚地計算出來。
下面列一下各種情況的一個總結:
print(18//10) print(12/10) print(-12/10) print(12/-10) print(12//-10) print(int(-12/10)) print(-13//10) print(int(-123 % -10)) print(-123%10) print(-123%-10) print(123%10) print(-123 // 10) print(123%-10)
1
1.2
-1.2
-1.2
-2
-1
-2
-3
7
-3
3
-13
-7