2013-08-07 93 views
2

讓我們的基本運算 - 模 - 蟒蛇VS C#

我得到這取決於不同的語言不同的輸出。

的Python

>>> -1 % 12 
11 

C#

var res = -1 % 12; 
output: res = -1 

爲什麼我看到這樣的行爲?理想情況下,我希望在這兩種情況下輸出爲。

也沒有人知道我是否可以在C#中實現這一點?

回答

10

問題的前提是錯誤的。 C#中的%運算符不是模運算符,它是運算符的餘數,而在Python中它是的模運算符。

由於Eric Lippert Describes,所有正數的模數和餘數是相同的,但它們處理負數的方式不同。

儘管C#和Python有一個%運算符,但這並不意味着它們都表示一個模數。

值得注意的是,其他語言(如C++和Java)對運算符%使用餘數,而不是模數,這可能有助於爲什麼C#選擇使用餘數。由於%運營商的含義並沒有太大的一致性,因此我建議在使用新語言時,在語言文檔中查找它。

+0

謝謝@Servy的全面解答。下次我使用新語言時,我一定會意識到這一點。謝謝 – dopplesoldner

+0

@RoadieRich:是的,我的意思是要核反應該評論。 –

2

在Python中,%運算符返回與除數相同的符號。在C#中,它返回與股息相同的符號。 (另請參閱Modulo operator

在Python中,math.fmod會給出與C#類似的結果。

如果你想在C#中獲得11,你可能需要說:

(((-1 % 12) + 12) % 12) 
+1

謝謝! 解決了我目前的需求 – dopplesoldner

0

其他人解釋爲什麼要在兩種語言中得到不同的結果,但要認識到兩個答案都是非常重要的正確的意思是說,當你扭轉操作時,你會找回原來的數字。

在C#中,整數除法-1/12的結果是00 * 120。要回到原來的-1,您需要添加-1,這是您在剩餘操作中獲得的。

在Python中,-1/12-1-1 * 12-12。要回到原來的-1,您需要添加11。這又是你得到的模數。

因此,不同操作%執行的操作不同,在兩種語言操作數的符號不同時執行整數除法的區別。選擇%的行爲,以便商數乘以除數並加到餘數中得到股息。改變商的計算方式必然會改變餘數的計算方式。