How does DoubleUtil.DoubleToInt(double val) work?中,我们了解到.NET Framework具有一种舍入浮点值的特殊方式:

public static int DoubleToInt(double val)
{
    return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}


为什么他们不只是使用(int)Math.Round(val)

或:如果优越,为什么没有这样定义Math.Round?必须权衡取舍。

最佳答案

我可以看到这是一种优化,因为要从Round获得相同的行为,您需要使用MidpointRounding.AwayFromZero选项。在reference source中,这是通过以下方式实现的:

private static unsafe double InternalRound(double value, int digits, MidpointRounding mode) {
    if (Abs(value) < doubleRoundLimit) {
        Double power10 = roundPower10Double[digits];
        value *= power10;
        if (mode == MidpointRounding.AwayFromZero) {
            double fraction = SplitFractionDouble(&value);
            if (Abs(fraction) >= 0.5d) {
                value += Sign(fraction);
            }
        }
        else {
            // On X86 this can be inlined to just a few instructions
            value = Round(value);
        }
        value /= power10;
    }
    return value;
}


我只能猜测实用程序方法的作者做了一些性能比较。

10-02 02:59
查看更多