今天在自己做的系統中,發現了一個奇怪的現象:幾個Double類型的數據相加,到最后得出的金額比正確數值總是少了幾毛錢。以為是程序里的計算方法有問題,可是排查了很多地方,始終沒有找到問題出在哪里。最后干脆把計算方法一句一句拆分,得到了最后最簡單的一步,就是把兩個具體的數值相加,但是最后的結果居然還是錯誤的。比如,現在已經到了最簡單的一步:
我們的系統里有保留小數位數為4位,按理是可以四舍五入成199.77的。但是因為有做金額的合計,是幾十甚至幾百個數據的相加,由于每兩個數相加的時候都可能產生上述誤差,因此最后得到的結果已經有了近0.7的誤差,就算再四舍五入也于事無補了。
上網查了一下相關資料,覺得CSDN論壇里的這個帖子的解釋還是比較詳細的:http://bbs.csdn.net/topics/300023952,大意是說由于運算的時候進行了進制的轉換造成的(見8樓回復),所有的精度類型在幾乎所有語言下都有這個問題。比較有效的解決辦法是使用BigDecimal(見14樓回復),但是我個人認為那個BigDecimal的解決辦法太麻煩了,至少對于我的系統來說是這樣。還不如每加一次之后都進行一次字符串轉換,保留有效的小數位數,比如,上述語句可以改寫成:
當然最好是把這種處理方法做成一個公用方法,專門用來處理兩個數的相加。
新聞熱點
疑難解答