說明:
.NET Framework 中的 Round 方法會執行「四捨六入五成雙」(Banker's Rounding),將結尾為 .5 的數字捨入或進位為最接近的偶數,而不是下一個較高的位數。
例如,2.5會捨入為 2,而 3.5 會進位為 4 (當資料交易很大時,此法有助於避免系統性地偏向較高位數的值)。
因此:
Math.Round方法有提供MidpointRounding列舉型別:
//當某個數字剛好位於另外兩個數字之間的中點時,將其捨入成為距離最近的偶數。
ToEven = 0,
//當某個數字剛好位於另外兩個數字之間的中點時,朝向遠離零的方向將其捨入成距離最近的數字。
AwayFromZero = 1,
選擇AwayFromZero即是我們熟知的算術四捨五入,
Math.Round(2.5, 0, MidpointRounding.AwayFromZero) = 3。
P.S.
在 T-SQL 中,Round函式則會一律往遠離 0 的方向捨入。因此 2.5 會捨入為 3,
但Round(0.5, 0)會出現「轉換 expression 到資料類型 numeric 時發生算術溢位錯誤。」
這應該是因為0.5的資料類型是numeric(1, 1),進位後為1.0導致有效位數不夠。
因此Round(0.4, 0)不會有錯誤。
可使用Round(CAST (0.5 AS numeric(2,1)), 0)增加有效位數或使用字串類型做處理(Round('0.5', 0))
參考資料:
http://www.dotblogs.com.tw/jeff-yeh/archive/2009/06/15/8834.aspx
http://msdn.microsoft.com/zh-tw/library/ms131274(VS.80).aspx
http://msdn.microsoft.com/zh-tw/library/bb882648(v=vs.90).aspx
http://sharedderrick.blogspot.tw/2009/06/round-sql-server-2008.html
http://www.dotblogs.com.tw/jaigi/archive/2011/05/11/24822.aspx
沒有留言:
張貼留言