17

Python と Java でモジュラス演算子の実装が異なることに気付きました。

たとえば、Python では次のようになります。

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

一方、Java では:

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

モジュラスと同じくらい基本的なものは普遍的に同じように解釈されると思っていたので、これは私を不意を突かれた. 私は Python の解釈のファンです (これは C から借用したものだと思います) が、Java の実装の背後にあるロジックは理解しています。

あなたは通常、どちらを好みますか? 解釈の違いには何か特別な理由があるのでしょうか? 私は言語戦争を始めるつもりはありません。単に興味があります。

4

4 に答える 4

6

私は C の解釈 (Python でも使用されます) を好み%ます。実際には はモジュラス演算子です。ウィキペディアのページとそこからのリンクでの適切な議論(注意しないと、代わりに被除数の符号を使用すると愚かなバグが発生する可能性がある理由についてのビットを含む;-)。

于 2010-02-07T00:20:43.100 に答える
4

今これを試してみてください:

>>> print 300 % -800
-500

違いの理由は、言語設計者は、除算後の余りに被除数または除数のどちらの符号を付けるかを決定できないように見えるためです。一部の言語ではどちらか一方も指定されていないため、実装者次第です。

モジュロ演算のウィキペディアのページには、言語、演算子、および期待される記号のリストがあります。始めるのに良い場所ですが、私は通常、いくつかの簡単なテストを実行し%て、以前にテストしたことのない言語で使用する前に、どのように動作するかを正確に把握していることを確認します。

于 2010-02-07T02:41:22.610 に答える
1

C 標準では、負のモジュロは未定義であり、多くの C コンパイラは Java が提供するものを提供します。ただし、Python では、常に正の数が得られます。これは、モジュロ加算と減算を実行できることを意味するため、より便利な場合がよくあります。負のモジュロが負になると、正しく機能しません。

モジュロから負の数を取得する利点が何であるかはわかりません。

于 2010-02-07T00:25:50.470 に答える
0

I prefer x mod n to give numbers between 0 and n-1 or between floor(n/2)-n and floor(n/2); this makes it easiest to do the math in one's head.

As long as everything is equivalent, I don't really care when it comes to languages--though one does have to be aware of the convention.

Incidentally, Java can't quite make up its mind--% on negative integers returns a negative value, the mod method of java.math.BigInteger returns values between 0 and n-1 (inclusive), and the divideAndRemainder method again returns negative values for negative integers.

于 2010-02-07T02:09:59.817 に答える