C#Math.Round的技术分析

时间:2013-11-01 05:57:13

标签: c# .net

在过去的两天里,我一直在阅读有关十进制和双倍关于四舍五入的阅读。

我想知道的是,是否有人知道Math.Round实际上是如何运作的?就像它转换为位然后对这些位进行舍入还是先进行舍入等?它是导入还是执行任何进行舍入的本机代码?等

如果有人有任何技术白皮书或链接,那就太棒了!

1 个答案:

答案 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;
    }
}