以下で -2 ではなく 2 になるのはなぜですか?
System.out.println(11%-3);
それを考慮して:
System.out.println(-11%3);
-2.. を返します。
前もって感謝します。
以下で -2 ではなく 2 になるのはなぜですか?
System.out.println(11%-3);
それを考慮して:
System.out.println(-11%3);
-2.. を返します。
前もって感謝します。
JLSの引用:
バイナリ数値昇格 ( §5.6.2
(a/b)*b+(a%b)
) 後の整数であるオペランドの剰余演算は、に等しいような結果値を生成 しa
ます。
この規則から、剰余演算の結果は、被除数が負の場合にのみ負になり、被除数が正の場合にのみ正になる可能性があることがわかります。さらに、結果の大きさは常に除数の大きさよりも小さくなります。
(私のものを強調してください。)
また、さまざまなプログラミング言語でのモジュロ演算子については、モジュロ演算を参照してください。
規則はJls 15.17.3 で指定されています。剰余演算子 % -
この規則から、剰余演算の結果は、被除数が負の場合にのみ負になる可能性があり、被除数が正の場合にのみ正になる可能性があることがわかります。さらに、結果の大きさは常に除数の大きさよりも小さくなります。
結果の符号は被除数の符号と等しいためです。 http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.17.3
まず、「remainder()」は次のことを意味します: a=b*c+r の場合、a,b,c,r は整数です。次に a%b = c
しかし、どのように c を選択すればよいかというと、プログラミング言語が異なれば実装も異なります。
C および Java では、残りは切り捨てとして計算されました。
-11% 3 = 3*(-3)+(-2) 11% (-3) = (-3)*(-3)+2
重要なポイントは、なぜ -3 を選択するのかということです。なぜなら:
切り捨て(-11/3)=切り捨て(-3.66)=-3
「truncate()」でint部分を0に近づける
Python などの他のプログラミング言語では、フロア除算を使用します。つまり、Python では: -11 % 3 = 3 * (floor(-11/3))+2
参照してください: http://python-history.blogspot.sg/2010/08/why-pythons-integer-division-floors.html
これは数学の問題です。
まず、-11%3 と 11%-3 は同じです。
2番目に、正の数が必要な場合は、「マイナス」を削除してください。11%3 または -11%-3 を試してください