最近開發時候遇到了一個問題,就是double相加、相減時候結果會有些微誤差,而這一點點的些微誤差就有可能會造成程式的錯誤。

 

範例程式碼:
double a = 0.4, result = 0;
for (int i = 1; i <= 10; i++)
{
    result += a;
    Response.Write(result + "<br/>");
}
以上這段程式碼跑出來的結果如下:


結果看起來正確無誤,但其實在相加、減時候result 會有些微誤差,請看下面的圖示~




 

原因:
double是屬於floating binary point types
也就是說double型態的數值在相加減時候,會先將數值轉換成10001.10010110011這種表示法再做相加減,
但是在轉換成二進位代碼表示法時候,儲存小數部份的位數會有不夠的現象,這就是造成些微差距的主要原因。

解決方法:
方法1.只取需要用到的位數,小數點太後面的位數部份就不要管了,不過用這個比較方法比較不好。

方法2.使用decimal,用decimal就不會出現上面的問題,可以準確的計算小數值,只是deciaml的範圍較double小,不過應該也夠用吧。
例如將上面的程式碼改為如下就OK了~~
Decimal a = 0.4m, result = 0;
for (int i = 1; i <= 10; i++)
{
    result += a;
    Response.Write(result + "<br/>");
}