在Python,a // b
被定義爲地板(A/B),作爲與整數除法定義爲trunc(a/b)的大多數其他語言相反。在對a % b
= a - (a // b) * b
的解釋中有相應的區別。
造成這種情況的原因是 Python的的%
運營商(和divmod
)的定義通常比其他語言的更有用。例如:
def time_of_day(seconds_since_epoch):
minutes, seconds = divmod(seconds_since_epoch, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
return '%02d:%02d:%02d' % (hours, minutes, seconds)
有了這個功能,time_of_day(12345)
返回'03:25:45'
,如你所願。
但是什麼時候它是12345秒之前時代?使用Python的divmod
的定義,time_of_day(-12345)
正確返回'20:34:15'
。
如果我們重新定義divmod
以使用/
和%
的C定義會怎麼樣?
def divmod(a, b):
q = int(a/b) # I'm using 3.x
r = a - b * q
return (q, r)
現在,time_of_day(-12345)
回報'-3:-25:-45'
,這不是一天的有效時間。如果標準Python divmod
函數以這種方式實現,則必須編寫特殊代碼來處理負輸入。但是像我的第一個例子那樣,地板式的部門就是Just Works。
您可以使用'math.fmod'來獲得與C或Java中相同的行爲。 – Helio 2017-01-28 16:42:38