-ClassMS.Internal.DoubleUtil
包含函数
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我想知道为什么这会将 val 转换为整数?
从 double 到 int 的转换总是占用地板,所以加上 0.5(如果是负数则减去 0.5)意味着 1.6 返回 2,而 1.4 将返回 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
这仅仅是因为它转换为(int)
. + 或 - 仅用于对值进行四舍五入。