因為公司做的項目幾乎都跟金錢、貨幣有關,所以對數字精確度有相當高的要求,而在開發和維護的時候自然經常會涉及到數值的計算。
但是在測試人員測數值的時候數值跟客戶提供的數據比對又總是有差異,基本都是±1塊錢或者±0.01之類的;
雖然知道這是在計算機計算的時候,其實這些數字是用二進制保存的,計算后轉換成十進制后會出現誤差,因為總會出現無限小數的情況。
以前碰到這種問題,基本上都是乘以一個整數10000或者100000,加上0.00001或0.000005之后無條件舍去小數,再除以前面乘上的數值;
這樣問題確實是暫時解決了,可是總會有解決不了的時候,比如數字不規律時,並不能知道是在第幾個小數出現誤差,這樣就會非常麻煩。
經過百度和查詢相關資料后總算知道解決辦法了:
如果你的項目中對數字精確度要求很高,那就請使用decimal類型保存數值;當然也適用於其他語言,像java里的BigDecimal。
摘自MSDN:
decimal 關鍵字表示 128 位數據類型。同浮點型相比,decimal 類型具有更高的精度和更小的范圍,這使它適合於財務和貨幣計算。
如果希望實數被視為 decimal 類型,請使用后綴 m 或 M,如果沒有后綴 m,數字將被視為 double 類型,從而導致編譯器錯誤。
如果項目對執行效率有更高的要求,那就使用double,因為double效率更高。
code測試:
結語:
雖然用decimal能解決像截圖例子的問題,但是或許不能解決掉所有數字計算的誤差問題,這畢竟是計算機底層的事情,
二進制轉換過程中總有可能出現誤差,避免不了,只能使用decimal盡量減少這種誤差的出現。后續如果再碰到了只能再看情況而定了~!