【发布时间】:2013-08-08 18:52:33
【问题描述】:
MS.Internal.DoubleUtil-Class 包含函数
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我想知道为什么这会将 val 转换为整数?
【问题讨论】:
MS.Internal.DoubleUtil-Class 包含函数
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我想知道为什么这会将 val 转换为整数?
【问题讨论】:
对于大于 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)。 + 或 - 仅用于对值进行四舍五入。
【讨论】:
从 double 到 int 的转换总是占用地板,因此添加 0.5(如果为负数则减去 0.5)意味着 1.6 返回 2,而 1.4 将返回 1。
【讨论】: