C# Math.Round()的銀行家算法

可能不少人都跟我同樣,都只知道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 
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息