可能不少人都跟我同樣,都只知道Math.Round()是C#中用來作四捨五入,保留指定小數位的算法
但實際上它並非真正的四捨五入,而是銀行家算法的四捨六入五取偶函數
事實上這也是IEEE的規範,所以全部符合IEEE標準的語言都應該採用這樣的算法。spa
其規則以下:code
一、當捨去位的數值小於5時。直接捨去blog
二、當捨去位的數值大於6時,進位加1class
三、當捨去位的數值等於5時,分兩種狀況:方法
(1)若5後面有其餘非0數字(即5不是最後一位)時,進位加1語言
(2)若5後面只有0(即5是最後一位)時,則根據5的前一位的奇偶來判斷,前一位爲奇數則進位加1,爲偶數則捨去di
遇到5須要捨去的狀況只有一種,即5是最後一位有效數且前一位數是偶數poi
數字的精度越大,則這個算法就越像真正的四捨五入
咱們使用這個函數時,用來處理的數字一般是那些有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