174

計算するとJavaint i = -1 % 2 になります。-1Pythonでは、1の結果として取得し-1 % 2ます。モジュロ関数を使用してJavaで同じ動作を実現するには、何をする必要がありますか?

4

5 に答える 5

196

ここでの問題は、Pythonでは%演算子がモジュラスを返し、Javaでは余りを返すことです。これらの関数は正の引数に対して同じ値を与えますが、モジュラスは負の入力に対して常に正の結果を返しますが、余りは負の結果を与える可能性があります。この質問には、それに関するいくつかの詳細情報があります。

これを行うことにより、正の値を見つけることができます。

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

またはこれ:

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

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

于 2011-03-21T23:42:30.757 に答える
138

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

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

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

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

于 2015-06-30T13:53:02.370 に答える
2

必要な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))
于 2011-03-21T23:50:11.997 に答える
2
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

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

于 2017-01-08T15:05:07.723 に答える
0

モジュラスが2の累乗である場合、ビットマスクを使用できます。

int i = -1 & ~-2; // -1 MOD 2 is 1

比較すると、Pascal言語は2つの演算子を提供します。REMは分子の符号を取り(x REM yx - (x DIV y) * yここにx DIV yありますTRUNC(x / y))、MODは正の分母を必要とし、正の結果を返します。

于 2011-03-22T00:15:56.727 に答える