Javaに次のように要求した場合:
System.out.print(-0.785 % (2*Math.PI));
結果を印刷すると、5.498を印刷する必要があるときに-0.785が表示されます...誰かが理由を説明できますか?
第 1 オペランドは負で、第 2 オペランドは正です。
JLS によると、セクション 15.17.3 :
[ここで、無限大もゼロも NaN も含まれない場合、除数 d による被除数 n の除算からの浮動小数点剰余 r は、数学的関係 r = n - (d · q) によって定義されます。 q は、n/d が負の場合にのみ負であり、n/d が正の場合にのみ正であり、その大きさは n と d の真の数学的商の大きさを超えない範囲で可能な限り大きい整数です。
剰余が正である必要はありません。
ここでn
は-0.785
、 とd
です2 * Math.PI
。q
大きさが真の数学的商を超えない最大のものは 0 です。
r = n - (d * q) = -0.785 - (2 * Math.PI * 0) = -0.785
わかりました、他の回答よりもうまく説明するつもりはありませんが、希望する結果を得る方法についてだけ述べましょう。
関数:
static double positiveRemainder(double n, double divisor)
{
if (n >= 0)
return n % divisor;
else
{
double val = divisor + (n % divisor);
if (val == divisor)
return 0;
else
return val;
}
}
何が起こっていますか:
の場合n >= 0
、標準の残りを行います。
の場合n < 0
、最初に剰余を行い、それを範囲 に入れ(-divisor, 0]
、次に を追加して、それをdivisor
目的の範囲 に入れます(0, divisor]
。しかし、待ってください、その範囲は間違っています。それは( [0, divisor)
is 5 + (-5 % 5)
, 5
not 0
) であるべきです。divisor
0