Javaでx mod -3から負数を出したいです。例: 1 mod -3 = -2 または 2 mod -3 = -1
この問題の方法はありますか?
%
Javaの演算子はモジュラス演算子ではなく、剰余です。(それらは同じものではありません)それはあなたが得ているさまざまな兆候を説明しています. 現在のJava 言語仕様、セクション§15.17.3 から:
二項 % 演算子は、暗黙の除算からオペランドの残りを生成すると言われています。左側のオペランドは被除数で、右側のオペランドは除数です。
C および C++ では、剰余演算子は整数オペランドのみを受け入れますが、Java プログラミング言語では、浮動小数点オペランドも受け入れます。
バイナリ数値昇格 (§5.6.2) 後の整数であるオペランドの剰余演算は、(a/b)*b+(a%b) が a に等しいような結果値を生成します。
この恒等式は、被除数がその型で可能な最大の大きさの負の整数で、除数が -1 (剰余が 0) であるという特別な場合でも保持されます。
この規則から、剰余演算の結果は、被除数が負の場合にのみ負になる可能性があり、被除数が正の場合にのみ正になる可能性があることがわかります。さらに、結果の大きさは常に除数の大きさよりも小さくなります。
X mod -Y
-X mod Y
定義したように、答えを解いてから否定することで計算できます。
例: 1 mod -3
-> -1 mod 3 = 2
->-2
特に Java では、 を実行し-X % Y
、ゼロでない場合は追加しY
、答えを否定します。
public static int negativeMod(int x, int y) {
if (y > 0) return x % y;
int newAnswer = (-1 * x) % (-1 * y);
if (newAnswer != 0) newAnswer -= y;
return -1 * newAnswer;
}
簡単だ。余りが 0 でない場合は、モジュラスを引きます。例 1 mod -3 の場合、1 - 3 は -2 であり、希望する答えです。これは、数学的恒等式 a == a - n (mod n) の単純な結果です。