web-dev-qa-db-ja.com

JavaのModは負の数を生成します

int i = -1 % 2を計算すると、Javaで-1を取得します。 Pythonでは、1の結果として-1 % 2を取得します。 modulo関数を使用してJavaで同じ動作を得るには何をしなければなりませんか?

130
Christian

ここでの問題は、Pythonでは%演算子がmodulusを返し、Javaでは剰余。これらの関数は正の引数に同じ値を与えますが、モジュラスは負の入力に対して常に正の結果を返しますが、残りは負の結果を与える場合があります。 この質問 にそれに関する情報があります。

これを行うことで正の値を見つけることができます:

int i = (((-1 % 2) + 2) % 2)

またはこれ:

int i = -1 % 2;
if (i<0) i += 2;

(明らかに-1または2は、分子または分母にしたいものであれば何でも構いません)

156
andrewmu

Java 8以降、 Math.floorMod() メソッドを使用できます。

Math.floorMod(-1, 2); //== 1

注:モジュロ値(ここでは2)が負の場合、すべての出力値も負になります。 :)

ソース: https://stackoverflow.com/a/25830153/2311557

93
codepleb

n % mが必要な場合:

int i = (n < 0) ? (m - (abs(n) % m) ) %m : (n % m);

数学的な説明:

n = -1 * abs(n)
-> n % m = (-1 * abs(n) ) % m
-> (-1 * (abs(n) % m) ) % m
-> m - (abs(n) % m))
2
amit
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

%演算子を2回使用しません。

2
Dico