python上取整和下取整(22.為什麼Python)
2023-05-18 18:48:43 3
本系列文章譯自Python之父 Guido van Rossum 的系列博客「The History of Python」。這個博客系列對我們理解Python及其演變很有幫助,經Guido同意,在這裡翻譯推薦給大家,希望大家喜歡,也請大家多多指教!
系列地址:http://blog.kantli.com/theme/1
1今天又有人問我,為什麼 Python 中整數相除是向下取整,而不像 C語言一樣靠 0 取整?
對正整數來說,兩種取整方式的結果是一樣的:
>>> 5//22
如果其中一個是負數,結果就不是向零靠近了(而向負無窮靠近):
>>> -5/2-3>>> 5//-2-3
這個問題讓一些人感到困擾,但其實是有數學考慮的。整除操作(//)與取模操作(%)是一個組合,共同實現一個數學關係(所有變量都是整數):
# a/b = q 餘 r
即
'# b*q r = a,其中 0 <= r < b
當 a 為負數(b 保持正數),我們有兩個選擇:一個是讓 q 向零取整,於是餘數 r 會變成負數,即 0 <= abs(r) = r > b。
2那麼,C語言為什麼採用了向零取整呢?或許是因為當時的硬體設計——在最早期的硬體中,負數的表現方式是「符號 數字」,而不是現在一般採用的補碼(至少整數是如此)。
我用的第一臺電腦是一臺 CDC 主機,其整數和浮點數都是用補碼表示的,60 個 1 表示的是負 0。
Tim Peters 曾擔心我會把這個原則擴展到浮點數。他或許是對的,當 x 是一個非常小的負數時,向下取整原則會導致 x % 1.0 出現精度損失。但這個問題並不影響我讓整數採取向下取整原則。
PS. 請注意,我用的符號是 // 而不是 /,這是 Python 3 中的句法,在 Python 2 中也可以使用,表示用戶明確使用整除而不是除號。Python 2 中的 / 操作可能會有歧義,因為當兩個參數都是整數時,它只返回整數,而當存在浮點數參數時,則返回浮點數。不過這是另一個故事了,可以參考 PEP 238。
公眾號:ReadingPython
,