Math.IEEERemainder(x,y)和 x%y 之间是否存在差异?
答案 0 :(得分:12)
不,他们不等同。 MSDN显示了用于模数和IEEERemainder的不同公式,并有一个展示差异的简短示例程序:
IEEERemainder = dividend - (divisor * Math.Round(dividend / divisor))
Modulus = (Math.Abs(dividend) - (Math.Abs(divisor) *
(Math.Floor(Math.Abs(dividend) / Math.Abs(divisor))))) *
Math.Sign(dividend)
它们具有不同/相同输出的一些示例(取自MSDN):
IEEERemainder Modulus
3 / 2 = -1 1
4 / 2 = 0 0
10 / 3 = 1 1
11 / 3 = -1 2
27 / 4 = -1 3
28 / 5 = -2 3
17.8 / 4 = 1.8 1.8
17.8 / 4.1 = 1.4 1.4
-16.3 / 4.1 = 0.0999999999999979 -4
17.8 / -4.1 = 1.4 1.4
-17.8 / -4.1 = -1.4 -1.4
在类似问题上,通过六个变量也可以看到这个好answer。
答案 1 :(得分:2)
这是来源:
public static double IEEERemainder(double x, double y) {
double regularMod = x % y;
if (Double.IsNaN(regularMod)) {
return Double.NaN;
}
if (regularMod == 0) {
if (Double.IsNegative(x)) {
return Double.NegativeZero;
}
}
double alternativeResult;
alternativeResult = regularMod - (Math.Abs(y) * Math.Sign(x));
if (Math.Abs(alternativeResult) == Math.Abs(regularMod)) {
double divisionResult = x/y;
double roundedResult = Math.Round(divisionResult);
if (Math.Abs(roundedResult) > Math.Abs(divisionResult)) {
return alternativeResult;
}
else {
return regularMod;
}
}
if (Math.Abs(alternativeResult) < Math.Abs(regularMod)) {
return alternativeResult;
}
else {
return regularMod;
}
}