2013-10-10 49 views
2

在Python文檔它說:「The % (modulo) operator yields the remainder from the division of the first argument by the second.Python模數與餘數相同嗎?

因此,考慮

a % b 

據我所知,其餘是從均勻分割的B留下的號碼。所以21%3 = 0,-25%23 = -2。 我不明白的是當A爲負時會發生什麼。

例如,

-23 % 22 

將產生

21 

哪個是第一正整數是全等模-1。但-1是-23%的剩餘部分22.文檔是否錯誤? Python中的模運算符%不會產生%b中的餘數,而是第一個與B一致模的正整數?我很困惑。

回答

6

有三種不同的明顯的方式在負數定義整數除法,以及三個相應的方式來定義其餘:

  • 地板分裂,其中所述商值朝向負無窮大地板,其餘具有相同的簽署爲除數。
  • 截斷除法,其中商被截斷爲零,餘數與被除數相同。
  • 歐幾里德除法,其中的商被截斷,無論哪個方向都會使剩餘部分爲正數。

所有這三個保留整數除法的基本法則:

dividend = divisor * quotient + remainder 

所以,沒有這三個是「正確」或「錯誤」 *

當然,這沒有按」中不要阻止人們參加聖戰。 Knuth以「數學上正確」爲基礎爭論地形師。沃斯主張截斷分裂,因爲它「不那麼令人驚訝」。 Raymond Boute認爲整數除法是根據歐幾里德算法定義的。我不會試圖解決一場數十年的聖戰,爭辯說他們三人,包括該領域最重要的兩個人都是錯誤的......

有些語言通過具有兩種不同的功能解決了這個問題。 **

我們只是說Python拿起了Knuth的定義,所以它的模運算符有除數的符號。


*當然選擇商和餘數的不匹配定義是另一回事。或者,更糟糕的是,指定一個並留下其他實現定義的,就像C在C99之前做的那樣。

**這特別有趣,因爲它們並不總是一致的,哪一個是哪個。至少當它們被稱爲remmodrem是與div而來的一個,而mod是取其地板或歐幾里德不div,當去的時候,他們是所謂remremaindermodmodulo ...

+0

[Wikipedia](http://en.wikipedia.org/wiki/Modulo_operation)對此的解釋比我好。 – abarnert

+0

這有助於一噸。謝謝! –

0

如果將-23除以22,則得-23 = -2 * 22 + 21.在Python中,「餘數」總是在0和除數之間(但不等於除數)。對於正數因子,商和模數通常在數學中定義。在一些編程語言中,負餘數用於正分頻因子,但在Python中不使用。

+0

編號嘗試'5%-3'。 – abarnert

+0

謝謝abarnert。我編輯我的答案是正確的(我希望)爲負的因數。 –