在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;
}
我只能猜测实用程序方法的作者做了一些性能比较。