私は係数を間違っていますか?なぜなら、Javaでは-13 % 64
評価することになっているから-13
です51
。
%
剰余演算子です。
私は係数を間違っていますか?なぜなら、Javaでは-13 % 64
評価することになっているから-13
です51
。
%
剰余演算子です。
回答:
負の数のモジュラスの両方の定義が使用されています。一部の言語は1つの定義を使用し、一部は別の定義を使用しています。
負の入力に対して負の数を取得したい場合は、これを使用できます。
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
同様に、負の入力で負の数を返す言語を使用していて、正の値を好む場合:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
A)が与えられた場合、x
負の場合、残りは負になりx % y == -(-x % y)
ます。B)の兆候はy
影響を及ぼしません。すなわちx % y == x % -y
「数学的に」両方が正しいので:
-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.3
-13 % 64 = 51
期待していたのに、なぜJavaが私にくれるの-13
か」ということです。
int result = (-5) % 3;
-2を与えます。int result = (-3) % 5;
-3を与えます。一般に、int result = (-a) % b;
| -a |の場合は正しい答えを与えます > b。| -a |のときに適切な結果を得るには <b除数をラップする必要があります。int result = ((-a) % b) + b;
負のaまたはint result = (((-a) % b) + b) % b;
正または負のa
Javaの結果は間違っています。どのようにして到達したか(Javaのプログラム、実装、バージョン)について説明してください。
15.17.3剰余演算子%
[...]
バイナリ数値昇格(§5.6.2)後の整数であるオペランドの剰余演算は、(a / b)* b +(a%b)が次のような結果値を生成しますa。
15.17.2除算演算子/
[...]
整数除算は0に向かって丸めます。
/はゼロに向かって丸められるため(結果はゼロになります)、この場合、%の結果は負になります。
int result = (-5) % 3;
与える-2 int result = (-3) % 5;
与える-3一般的に、int result = (-a) % b;
| -a | > b | -a |のときに適切な結果を得るには <b除数をラップする必要があります。int result = ((-a) % b) + b;
負のaの場合、またはint result = (((-a) % b) + b) % b;
正または負のaの場合。
(-3) % 5
は、定義に従って正しい結果は-3
であり、Javaの正しい実装はその結果を生成するはずです。
(-3)%5
確かにを与え-3
、正の余りが必要な場合は5を追加する必要があります。結果は2
あなたは使うことができます
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
。(おそらくあなたの方が読みやすいでしょう。)
[0, sign(divisor) * divisor)
なくの範囲にする場合に役立ちます[0, sign(dividend) * divisor)
。
あなたの答えはウィキペディアにあります: modulo operation
Javaでは、剰余演算のサインオンは被除数のサインオンと同じであると述べています。残りの除算演算については問題ないので、-13 / 64 = 0であるため、この場合は-13が返されます。-13-0= -13。
編集:申し訳ありませんが、あなたの質問を誤解しています...あなたは正しい、javaは-13を与えるべきです。もっと周囲のコードを提供できますか?
x = x + m = x - m
モジュラスでm
。
だから-13 = -13 + 64
モジュラス64
と-13 = 51
モジュラスで64
。
と仮定しますZ = X * d + r
。その場合0 < r < X
、部門Z/X
でr
残りを呼び出します。
Z % X
の残りを返しますZ/X
。
Javaの最新バージョンでは、次のようになり-13%64 = -13
ます。答えは常に分子の符号を持ちます。
この場合、Javaは51を返しません。MacでJava 8を実行していますが、次のようになります。
-13 % 64 = -13
プログラム:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}