0

在过去的 2 天里,我一直在阅读大量关于小数与双精度的四舍五入。

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

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

4

1 回答 1

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;
    }
}
于 2013-11-01T06:06:34.277 回答