讓我們的基本運算 - 模模 - 蟒蛇VS C#
我得到這取決於不同的語言不同的輸出。
的Python
>>> -1 % 12
11
C#
var res = -1 % 12;
output: res = -1
爲什麼我看到這樣的行爲?理想情況下,我希望在這兩種情況下輸出爲。
也沒有人知道我是否可以在C#中實現這一點?
讓我們的基本運算 - 模模 - 蟒蛇VS C#
我得到這取決於不同的語言不同的輸出。
的Python
>>> -1 % 12
11
C#
var res = -1 % 12;
output: res = -1
爲什麼我看到這樣的行爲?理想情況下,我希望在這兩種情況下輸出爲。
也沒有人知道我是否可以在C#中實現這一點?
問題的前提是錯誤的。 C#中的%
運算符不是模運算符,它是運算符的餘數,而在Python中它是是的模運算符。
由於Eric Lippert Describes,所有正數的模數和餘數是相同的,但它們處理負數的方式不同。
儘管C#和Python有一個%
運算符,但這並不意味着它們都表示一個模數。
值得注意的是,其他語言(如C++和Java)對運算符%
使用餘數,而不是模數,這可能有助於爲什麼C#選擇使用餘數。由於%
運營商的含義並沒有太大的一致性,因此我建議在使用新語言時,在語言文檔中查找它。
在Python中,%
運算符返回與除數相同的符號。在C#中,它返回與股息相同的符號。 (另請參閱Modulo operator)
在Python中,math.fmod
會給出與C#類似的結果。
如果你想在C#中獲得11
,你可能需要說:
(((-1 % 12) + 12) % 12)
謝謝! 解決了我目前的需求 – dopplesoldner
其他人解釋爲什麼要在兩種語言中得到不同的結果,但要認識到兩個答案都是非常重要的正確的意思是說,當你扭轉操作時,你會找回原來的數字。
在C#中,整數除法-1/12
的結果是0
。 0 * 12
是0
。要回到原來的-1
,您需要添加-1
,這是您在剩餘操作中獲得的。
在Python中,-1/12
是-1
。 -1 * 12
是-12
。要回到原來的-1
,您需要添加11
。這又是你得到的模數。
因此,不同操作%
執行的操作不同,也在兩種語言操作數的符號不同時執行整數除法的區別。選擇%
的行爲,以便商數乘以除數並加到餘數中得到股息。改變商的計算方式必然會改變餘數的計算方式。
謝謝@Servy的全面解答。下次我使用新語言時,我一定會意識到這一點。謝謝 – dopplesoldner
@RoadieRich:是的,我的意思是要核反應該評論。 –