可能很多人都跟我一樣,都只知道Math.Round()是C#中用來做四舍五入,保留指定小數位的
但實際上它並不是真正的四舍五入,而是銀行家算法的四舍六入五取偶
事實上這也是IEEE的規范,因此所有符合IEEE標准的語言都應該采用這樣的算法。
其規則如下:
1、當舍去位的數值小於5時。直接舍去
2、當舍去位的數值大於6時,進位加1
3、當舍去位的數值等於5時,分兩種情況:
(1)若5后面有其他非0數字(即5不是最后一位)時,進位加1
(2)若5后面只有0(即5是最后一位)時,則根據5的前一位的奇偶來判斷,前一位為奇數則進位加1,為偶數則舍去
遇到5需要舍去的情況只有一種,即5是最后一位有效數且前一位數是偶數
數字的精度越大,則這個算法就越像真正的四舍五入
我們使用這個函數時,用來處理的數字通常是那些有n位小數的數字,而我們用於顯示的通常也就只有2-4位,所以這也就不容易發現這個問題
可能光是文字大家不好理解,下面寫幾個例子
Math.Round(1.14 , 1) //result:1.1 Math.Round(1.25 , 1) //result:1 .2 五是最后一位且前一位為 偶數,也舍去 Math.Round(1.15 , 1) //result:1 .2 五是最后一位但前一位為奇數,進位加一 Math.Round(1.16 , 1) //result:1 .2
.NET 2.0 開始,Math.Round 方法提供了一個枚舉選項 MidpointRounding.AwayFromZero 可以用來實現傳統意義上的"四舍五入"。
Math.Round(1.25 , 1) //result:1 .2 Math.Round(1.25 , 1, MidpointRounding.AwayFromZero) //result:1 .3