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

时间:2013-08-07 11:50:15

标签: c# wpf int double

MS.Internal.DoubleUtil - 类包含函数

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

我想知道为什么这会'将'转换为整数?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

对于数字&gt; 0它增加0.5并截断。对于数字&lt; 0它减去0.5并截断。

(int)强制转换实际上会截断,因此(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范围之外的值)可能会被忽略,因此Double特殊值(NaNPositiveInfinityNegativeInfinity

某些double数字可能存在一些问题,因为double不是“精确”(解释起来很复杂,试着寻找双重为什么不好),而且你看到的往往是不是你拥有的,所以你可以拥有你认为是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

答案 2 :(得分:0)

这只是因为强制转换(int)。 +或 - 仅用于对值进行四舍五入。