可能不少人都跟我同样,都只知道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