在C#中使用Math.Round(1.25, 1),期望得到1.3,結果卻是1.2。
1.因為Math.Round方法並不是遵循四捨五入的原則,而是採用“四捨六入五成雙”這種方式,若需要舍入到的位的後面"小於5"或"大於5"的話,按通常意義的四捨五入處理.若"若需要舍入到的位的後面"等於5",則要看舍入後末位為偶數還是奇數,舉例:
Math.Round(1.25, 1) = 1.2 因為5前面是2,為偶數,所以把5捨去不進位
Math.Round(1.35, 1) = 1.4 因為5前面是3,為奇數,所以進位
而0也看成為偶數,所以Math.Round(0.5, 0) = 0
2.從統計學的角度,"四捨六入五成雙"比"四捨五入"要科學,它使舍入後的結果有的變大,有的變小,更平均.而不是像四捨五入那樣逢五就入,導致結果偏向大數.
例如:1.15+1.25+1.35+1.45=5.2,若按四捨五入取一位小數計算
1.2+1.3+1.4+1.5=5.4
按"四捨六入五成雙"計算,1.2+1.2+1.4+1.4=5.2,舍入後的結果更能反映實際結果 3.在C#和VB.net,都是"四捨六入五成雙"原則,而 Sql Server 是簡單的"四捨五入"。
但是如果單獨對一個數進行四捨五入,這種方法明顯是不行的,因為Math.Round(0.5, 0) = 0,所以需要另外自己寫一個方法去實現,下面是在我們項目中用的方法,供大家參考:C#代碼
- public staticdecimal Round(decimal d,int decimals)
- {
- decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));
- decimal scrD = d * tenPow + 0.5m;
- return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);
- }
public static decimal Round(decimal d, int decimals){ decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals)); decimal scrD = d * tenPow + 0.5m; return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);}
另外,如果小數位足夠長,也可以Decimal.Round這個方法,舉例:
Decimal.Round(1.25, 1) = 1.2
但是如果是 Decimal.Round(1.251, 1) = 1.3
所以採用下面的方法也能達到四捨五入的效果 C#代碼
- public staticdecimal MyDecimalRound(decimal d,int
decimals)
- {
- d = d + 0.000000000000001m;
- return Decimal.Round(d, decimals);
- }