2010-02-07 68 views
14

我注意到Python和Java中模數運算符的不同實現。Python與模塊實現之間的區別對比Java

例如,在Python:

>>> print -300 % 800 
>>> 500 

而在Java中:

System.out.println(-300 % 800); 
-300 

這了我個措手不及,因爲我想的東西基本爲模被普遍解釋方式。儘管我看到了Java實現背後的邏輯,但我仍是Python解釋的粉絲(我認爲這是從C中借用的)。

你通常喜歡哪一個?對於不同的解釋有沒有具體的原因?我無意開始語言戰爭,只是好奇而已。

+1

如果我正在閱讀Alex正確發佈的Wikipedia頁面,Python的math.fmod將返回與Java的mod相同的結果。 – 2010-02-07 00:26:48

回答

6

我更喜歡C的解釋(也用於Python),其中%確實是一個模數運算符。在wikipedia page及其鏈接中的良好討論(包括一點關於爲什麼取而代之的紅利可能會導致一個愚蠢的錯誤,除非一個人的謹慎;-)。

+0

C99使用分紅的標誌,C89依賴於實施,至少根據您鏈接的文章。 – ergosys 2010-02-07 00:35:57

+0

你可以在Java中使用'%'來編寫一個和Python完全相同的函數;請參閱http://stackoverflow.com/a/3417242/320036 – z0r 2015-02-18 04:53:28

+0

C的行爲像Java,而不是Python。 – ryancerium 2017-02-25 21:49:17

1

在C標準中,負模不確定,許多C編譯器會給你Java給你的東西。不過在python中,你總會得到一個正數,這通常更有用,因爲這意味着你可以做模加法和減法。如果否定模以給你一個否定的話,它就不能正常工作。

我不知道從模數中得到負數有什麼好處。

0

我更喜歡x mod n給出數字介於0和n-1之間或在地板(n/2)-n和地板(n/2)之間;這使得最容易在腦中進行數學運算。

只要一切都是相同的,我不太在乎語言 - 儘管人們必須意識到約定。

順便說一句,爪哇不能完全下定決心 - %的負整數返回負值,的java.math.BigInteger返回值0和n-1(含)之間的mod方法,以及divideAndRemainder方法再次返回負負整數的值。

3

現在試試這個:

>>> print 300 % -800 
-500 

的原因不同的是,語言的設計者似乎無法決定餘數是否應該有股息除數的跡象。有些語言甚至沒有指定其中的一種,因此取決於實施者。

有一個語言列表,運營商,以及在Modulo operation維基百科頁面上期望的符號。這是一個很好的開始,但我通常只是進行一些簡單的測試,以確保我確切地知道%在我以前沒有測試過的任何語言中使用它之前的行爲。

相關問題