MS.Internal.DoubleUtil
- 类包含函数
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我想知道为什么这会'将'转换为整数?
答案 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
特殊值(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
答案 2 :(得分:0)
这只是因为强制转换到(int)
。 +或 - 仅用于对值进行四舍五入。