DoubleUtil.DoubleToInt(double val)如何工作?

MS.Internal.DoubleUtil包含该函数

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

我想知道为什么这个’将’转换为整数?

从double到int的强制转换始终占据底线,因此添加.5(如果为负则减去.5)意味着1.6返回2,而1.4将返回1。

对于数字> 0,它会增加0.5并截断。 对于数字<0,它减去0.5并截断。

(int)7.995 == 7实际上是截断的,所以(int)7.8 == 7(int)-7.8 == 7(int)7.995 == 7等等。

所以我们有:

 0-0.499999... is rounded to 0 (0.499999 + 0.5 == 0.999999 trucated == 0) 0.5-1... is rounded to 1 (1 + 0.5 == 1.5 truncated == 1) 

等等。

负数相反。

边界情况( int.MinValue - int.MaxValue之外的值int.MinValue - int.MaxValue范围)可能被忽略,因此Double特殊值( NaNPositiveInfinityNegativeInfinity

一些double数字可能存在一些问题,因为double不是“精确”(解释起来很复杂,试着寻找为什么双重是坏的)而且你经常看到的并不是你所拥有的,所以你可以拥有一些东西think是1.5,但实际上是1.499999999999985,因此它舍入为1而不是2。

就像是:

 double d = 11.3; // There are 20x += 0.01 d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01; Console.WriteLine("{0}", d); Console.WriteLine("{0:R}", d); Console.WriteLine("{0}", DoubleToInt(d)); 

结果:

 11.5 11.499999999999996 11 

这只是因为它转换(int) 。 +或 – 仅用于舍入值。