上方廣告

2011年5月19日 星期四

double型態乘法問題

前一陣子同事在抓一個程式的Bug的時候發生了一件百思不得其解的問題,double型態在進行兩個變數比較的時候出現了【24.9 != 24.9】的詭異現象。下面法法中可以發現當變數A=24.9; B=8.3*3;這樣出來比較出來竟然出現了false的情況,在將兩變數轉換成字串型態後比較竟然又相等了。有此可見,雙精倍數在儲存變數的時候可能內含了極小的小數,小到在轉換成字串型態的時候無法出現所導致。

double A = 24.9;
double B = 8.3 * 3;
decimal C = 24.9M;
decimal D = 8.3M * 3M;

Console.WriteLine("double A = 24.9");
Console.WriteLine("double B = 8.3 * 3");
Console.Write("A == B 結果為 ==> ");
Console.WriteLine(A == B);
Console.Write("A.ToString() == B.ToString() 結果為 ==> ");
Console.WriteLine(A.ToString() == B.ToString());
Console.WriteLine("");

Console.WriteLine("decimal C = 24.9M");
Console.WriteLine("decimal D = 8.3M * 3M");
Console.Write("C == D 結果為 ==> ");
Console.WriteLine(C == D);
Console.Write("C.ToString() == D.ToString() 結果為 ==> ");
Console.WriteLine(C.ToString() == D.ToString());
Console.WriteLine("");



結論,要進行浮點數運算最好還是使用decimal來進行,避免發生看的結果並不保證是實際的結果。