[.net]Math.Round(decimal, Int32) 與 Math.Round(Double, Int32)
在MSDN論譠上有看到「小數點捨入問題」。
第1個問題是常遇到的 四捨六入五成雙 的問題,如下,
decimal g = Math.Round((decimal)4.125, 2); // 4.12
decimal h = Math.Round((decimal)4.135, 2); // 4.14
如果要像我們一般認知的4捨5入的話,就要設定 MidpointRounding.AwayFromZero ,如下,
decimal i = Math.Round((decimal)4.125, 2, MidpointRounding.AwayFromZero); // 4.13
decimal j = Math.Round((decimal)4.135, 2, MidpointRounding.AwayFromZero); // 4.14
可參考: Math.Round 方法 (Decimal, Int32, MidpointRounding)
另一個問題是說,一個明明要進位,卻沒有進位的問題,2.1555取到小數2位應該是要2.16呀,為何出來的是2.15呢? 如下,
double c = Math.Round((double)2.155, 2 ); // 2.15
double f = Math.Round((double)4.155, 2); // 4.16
這個問題可參考: Math.Round 方法 (Double, Int32)
因為double是非精準數值,所以Round時,會先轉成10進位,然後再來處理Round。所以因此造成該進位而沒進位的狀況。
所以如果要依精準運算的話,請使用精準資料型態,如decimal。
所以如果使用decimal就是我們所認知的進位情形了,如下,
decimal a = Math.Round((decimal)2.155, 2); // 2.16
decimal b = Math.Round((decimal)4.155, 2); // 4.16
DB的欄位的設計也是相同的情況哦! 可參考「資料庫使用FLOAT欄位來記錄金額對嗎?」。
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^