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
特殊值( NaN
, PositiveInfinity
, NegativeInfinity
)
一些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)
。 +或 – 仅用于舍入值。