double相加(減)結果會有些誤差
阿新 • • 發佈:2019-01-25
前提介紹
今天在除錯程式碼的時候發現了一個double型別資料相減的有趣問題,148163.1 - 82692.09大家猜猜結果等於多少,經過除錯最終為5471.010000000009。
是不是很奇怪,下面將說明這其中的奧妙!
原因說明
double屬於floating binary point types,也就是說都double型的數值在相加減的時候,會將數值轉換成二進位制的數值如10001.10010110011這種表示發再做相加減,但是在轉換成二進位制程式碼表示的時候,儲存小數部分的位數會有不夠的現象,即無限迴圈小數,這就是造成微差距的主要原因。
解決方法
1.只取需要用到的位數:
小數點臺後面的位數部分就不要管了,不過這種方法不太好。
2.使用Decimal型別:
用Decimal就不會出現上面的問題了,可以準確的計算小數值,知識Decimal的範圍比double小,一般情況下也夠用了。
Decimal型別的有效位數達到28位,而double型別的16位,所以Decimal型別比Double型別能表示更精確的浮點數。相關知識可以參考下面的連結。
總結
1.在double型別數值進行比較大小的情況最好使用1.02-1.01==double.MinValue這種方式進行判斷
2.使用double型別進行加減的情況下看看能否使用Decimal型別進行計算