概要
今天出現一個問題,235844.46-230000相減,得出的結果出乎意料,出來的結果如截圖:
看到這個結果大感意外,嘗試更改數值試試:
把235844.46更改為235844.47,然后235844.47-230000=5844.47,咦,居然正常了。
把把235844.46更改為235844.45,然后235844.45-230000=5844.45000000001,哎,又有問題了。
原因
double型的數值在相加減的時候,會先將數值轉換成二進制的數值如10001.10010110011,然后再做相加減。但是在轉換成二進制代碼表示的時候,存儲小數部分的位數會有不夠的現象,即無限循環小數,這就是造成微差距的主要原因。
解決方法
計算機計算都是二進制數字,首先是將數字轉化成二進制數(這樣容易造成二進制有可能位數不夠的情況)然后再計算,這樣就造成了誤差,Decimal類型的有效位數達到28位,而double類型的16位;對於一般的數據量不大的計算推薦用Decimal來;