2

-ClassMS.Internal.DoubleUtil包含函数

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

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

4

3 回答 3

4

从 double 到 int 的转换总是占用地板,所以加上 0.5(如果是负数则减去 0.5)意味着 1.6 返回 2,而 1.4 将返回 1。

于 2013-08-07T11:53:14.887 回答
1

对于数字 > 0,它会增加 0.5 并截断。对于数字 < 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特殊值(NaN, PositiveInfinity, NegativeInfinity)也会被忽略

某些数字可能存在一些问题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
于 2013-08-07T11:52:59.540 回答
0

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

于 2013-08-07T11:53:58.803 回答