web-dev-qa-db-ja.com

Javaはどうやって負の数でモジュラスを計算しますか?

モジュラスが間違っていますか? Java _-13 % 64-13と評価されるはずですが、51を取得するためです。

86
Jakir00

負の数のモジュラスの両方の定義が使用されています-一部の言語は1つの定義を使用し、他の一部は使用します。

負の入力に対して負の数を取得したい場合、これを使用できます:

int r = x % n;
if (r > 0 && x < 0)
{
    r -= n;
}

同様に、負の入力で負の数を返す言語を使用していて、正の値を好む場合:

int r = x % n;
if (r < 0)
{
    r += n;
}
98
Mark Byers

「数学的に」両方とも正しいので:

-13 % 64 = -13 (on modulus 64)  
-13 % 64 = 51 (on modulus 64)

オプションの1つはJava言語開発者が選択する必要があり、彼らは以下を選択しました。

結果の符号は配当の符号と等しくなります。

Java仕様でそれを言う:

https://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.

69
Caner

本当にJavaで作業していますか? 'Javaは、期待どおり-13%64 = -13を与えるためです。配当のサイン!

19
Keyxeq

Javaの結果は間違っています。それに到達した経緯(プログラム、実装、Javaのバージョン)を提供してください。

Java言語仕様 から

15.17.3剰余演算子%
[...]
15.17.2除算演算子/
[...]
整数除算は0に向かって丸めます。

/はゼロに丸められる(ゼロになる)ため、この場合、%の結果は負になるはずです。

14
starblue

使用できます

(x % n) - (x < 0 ? n : 0);
5
ruslik

あなたの答えはウィキペディアにあります: modulo operation

Javaでは、モジュロ演算の符号は被除数の符号と同じであると言います。除算の残りの部分については話をしているので、-13/64 = 0なので、-13を返します。-13-0= -13です。

編集:申し訳ありませんが、あなたの質問を誤解している...あなたは正しい、Javaは-13を与えるべきです。周囲のコードをもっと提供できますか?

3
Nava Carmon

負のオペランドを使用したモジュロ演算は、言語設計者によって定義されます。言語設計者は、それを言語実装に任せ、CPUアーキテクチャに定義を委ねることができます。

Java言語定義を見つけることができませんでした。
ありがとう、Ishtar、Java 剰余演算子の言語仕様% は、結果の符号が分子のサイン。

2
wallyk

x = x + m = x - mモジュラスm
so -13 = -13 + 64モジュラス64および-13 = 51モジュラス64
_Z = X * d + rと仮定し、0 < r < Xの場合、部門Z/Xで残りをrと呼びます。
Z % Xは、Z/Xの残りを返します。

1
user415789

これを克服するには、正の値になるまで、負の値に64(またはモジュラスベース)を追加します。

int k = -13;
int modbase = 64;

while (k < 0) {
    k += modbase;
}

int result = k % modbase;

結果は同じ等価クラスに残ります。

1
Andreas

Mod関数は、数値がその数値以下の除数の最大整数倍を超える量として定義されます。だからあなたの場合

-13 % 64

-13を超えない64の最大整数倍数は-64です。さて、-64から-13を引くと51 -13 - (-64) = -13 + 64 = 51になります

1
Salman Paracha

JLSのセクション15.17.3によると、「2進数の昇格後の整数であるオペランドの剰余演算は、(a/b)* b +(a%b)がaと等しくなるような結果値を生成します。特別なケースでは、被除数はその型の可能な最大の負の整数であり、除数は-1(余りは0)です。」

お役に立てば幸いです。

0
kudesiaji

Java最新バージョンでは、-13%64 = -13を取得します。答えには常に分子の符号が付きます。

0

私のバージョンのJava JDK 1.8.0_05 -13%64 = -13

-13-(int(-13/64))を試すことができます。つまり、整数に除算して小数部を取り除き、分子から減算することができます。したがって、numerator-(int(numerator/denominator))は正しい残りとサイン

0
Robert Green