的MS.Internal.DoubleUtil
-Class包含函數DoubleUtil.DoubleToInt(double val)是如何工作的?
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我不知道爲什麼這個 '轉換' VAL到一個整數?
的MS.Internal.DoubleUtil
-Class包含函數DoubleUtil.DoubleToInt(double val)是如何工作的?
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
我不知道爲什麼這個 '轉換' VAL到一個整數?
從雙總是詮釋鑄造需要在地板上,因此添加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)
。 +或 - 僅用於對值進行舍入。