在过去的 2 天里,我一直在阅读大量关于小数与双精度的四舍五入。
我想知道的是,有人知道 Math.Round 在幕后实际上是如何工作的吗?就像它是先转换为位然后对这些位进行舍入还是先舍入等?它是否导入或执行任何进行舍入的本机代码?ETC
如果有人有任何技术白皮书或链接,那就太棒了!
使用反编译器从 mscorlib.dll 中获取。请注意,还有许多其他重要的调用。我建议获得一个反编译器并自己单步执行。干杯
[__DynamicallyInvokable]
[SecuritySafeCritical]
public static extern double Round(double a);
[__DynamicallyInvokable]
public static double Round(double value, int digits)
{
if (digits < 0 || digits > 15)
{
throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits"));
}
return Math.InternalRound(value, digits, MidpointRounding.ToEven);
}
[SecuritySafeCritical]
private static double InternalRound(double value, int digits, MidpointRounding mode)
{
unsafe
{
if (Math.Abs(value) < Math.doubleRoundLimit)
{
double num = Math.roundPower10Double[digits];
value = value * num;
if (mode != MidpointRounding.AwayFromZero)
{
value = Math.Round(value);
}
else
{
double num1 = Math.SplitFractionDouble(ref value);
if (Math.Abs(num1) >= 0.5)
{
value = value + (double)Math.Sign(num1);
}
}
value = value / num;
}
return value;
}
}