2012-04-08 18 views
6

負紅利一直在尋找通過其他的答案,我還是不通過DF理解爲負數模在python模在Python中

例如答案

x == (x/y)*y + (x%y) 

因此它是有道理的, (-2)(%)5 = -2 - (-2/5)* 5 = 3

這不是(-2 - (-2/5)* 5)= 0還是我瘋了? Modulus operation with negatives values - weird thing?

同樣的,這個 negative numbers modulo in python 他在哪裏-2的?

最後,如果符號依賴於股息,爲什麼負紅利與正面的紅利沒有相同的輸出?

。例如

print([8%5,-8%5,4%5,-4%5]) 

輸出

[3, 2, 4, 1] 
+0

您可以使用'math.fmod'來獲得與C或Java中相同的行爲。 – Helio 2017-01-28 16:42:38

回答

9

在Python,模是根據兩個規則計算:

  • (a // b) * b + (a % b) == a,和
  • a % b具有相同的符號作爲b

將此與整數除法向下(趨向-∞)的事實相結合,並解釋結果行爲。

如果你這樣做-8 // 5,你得到-1.6向下取整,即-2。乘以5,你得到-10; 2是你必須添加到-8的數字。因此,-8 % 5是2.

0

當你把整數(-2/5)* 5不評價爲-2,因爲它會在代數你習慣了。嘗試將其分解爲兩個步驟,首先在圓括號中評估該部分。

  1. (-2/5)* 5 =(-1)* 5
  2. (-1)* 5 = -5

原因第1步是你做的int劃分,它在python 2.x中返回相等的浮點除法結果,向下舍入到最接近的整數。

在Python 3及更高版本中,2/5將返回一個浮點數,請參閱PEP 238

0

退房this BetterExplained article看@戴維的評論(第6號),以獲得別人正在談論的內容。

由於我們工作瓦特/整數,我們做一個INT除法其中,在Python的地板而不是ç答案。欲瞭解更多,請閱讀Guido's article

至於你的問題:

>>> 8 % 5 #B'coz (5*1) + *3* = 8 
3 
>>> -8 % 5 #B'coz (5*-2) + *2* = -8 
2 

希望這有助於。它在一開始也讓我困惑(它仍然如此)! :)

3

這背後的基本原理實際上是least residue的數學定義。 Python尊重這個定義,而在大多數其他編程語言中,模數運算符更像是一個'分割後'的運算符。爲了計算的-5 % 11的至少殘基,簡單地添加11至-5,直到獲得在範圍[0,10]一個正整數,並且其結果是6

5

在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。

+1

我只使用過一點Python,並沒有留下深刻的印象,但它至少讓我看到至少有一種編程語言支持可用的除法運算符。你的時間安排很好。我見過有人抱怨歐幾里德模數運算符不能從負數中提取數字(例如,即使最後一位數字是3,-123%10也會得到7)。另一方面,產生-3的C型剩餘操作符並不是更好。 – supercat 2013-12-19 09:14:30