Math.round四捨五入

       在用Math.Round做數據處理的時候,經常遇到81.25保留一位小數,則爲81.2的情況,經過材料查找,Math.Round四捨五入算法採用“銀行家舍入(Banker's rounding)”,是IEEE規定的舍入標準,所謂銀行家舍入法,其實質是一種四捨六入五取偶(又稱四捨六入五留雙)法。其規則是:當捨去位的數值小於5時,直接捨去該位;當捨去位的數值大於等於6時,在捨去該位的同時向前位進一;當捨去位的數值等於5時,如果前位數值爲奇,則在捨去該位的同時向前位進一,如果前位數值爲偶,則直接捨去該位。 通過msdn瞭解到Math.Round重載列表
       Math.Round (Decimal):將小數值舍入到最接近的整數。由 .NET Compact Framework 支持。
       Math.Round (Double):將雙精度浮點值舍入爲最接近的整數。由 .NET Compact Framework 支持。
       Math.Round (Decimal, Int32):將小數值舍入到指定精度。由 .NET Compact Framework 支持。
       Math.Round (Decimal, MidpointRounding):將小數值舍入到最接近的整數。一個參數,指定當一個值正好處於另兩個數中間時如何舍入這個值。 
       Math.Round (Double, Int32):將雙精度浮點值舍入到指定精度。由 .NET Compact Framework 支持。
       Math.Round (Double, MidpointRounding):將雙精度浮點值舍入爲最接近的整數。一個參數,指定當一個值正好處於另兩個數中間時如何舍入這個值。
       Math.Round (Decimal, Int32, MidpointRounding):將小數值舍入到指定精度。一個參數,指定當一個值正好處於另兩個數中間時如何舍入這個值。
       Math.Round (Double, Int32, MidpointRounding):將雙精度浮點值舍入到指定精度。一個參數,指定當一個值正好處於另兩個數中間時如何舍入這個值。
       MSDN
下面通過一個例子瞭解具體情況
    Math.Round(0.145, 2, MidpointRounding.AwayFromZero)
    Math.Round(0.145, 2, MidpointRounding.ToEven)
運行結果:
    0.14
    0.14
很令人詫異的結果,這是因爲我們調用的是Math.Round的double重載,需要調用decimal重載
    Math.Round((decimal)0.145, 2, MidpointRounding.AwayFromZero)
    Math.Round((decimal)0.145, 2, MidpointRounding.ToEven)
運行結果:
    0.15
    0.14
下面來看下:MidpointRounding
       ToEven:當一個數字是其他兩個數字的中間值時,會將其舍入爲最接近的偶數。
        AwayFromZero:當一個數字是其他兩個數字的中間值時,會將其舍入爲兩個值中絕對值較小的值。

在默認情況下都是使用ToEven,在上面的代碼中可以發現。


在SQLServer數據庫中也存在類似情況,在開發過程中,寫了函數處理該情況,可以參考http://blog.csdn.net/mh942408056/article/details/8234320

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章