在过去的两天里,我一直在阅读有关十进制和双倍关于四舍五入的阅读。
我想知道的是,是否有人知道Math.Round实际上是如何运作的?就像它转换为位然后对这些位进行舍入还是先进行舍入等?它是导入还是执行任何进行舍入的本机代码?等
如果有人有任何技术白皮书或链接,那就太棒了!
答案 0 :(得分:1)
使用反编译器从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;
}
}