C# 中,使用 Math.Round 方法时,需要注意这不是简单的四舍五入!

> 为什么 Math.Round(4.125, 2) 的结果是 4.12 而不是 4.13

在计算机中对浮点数的处理是按 IEEE 754 标准进行的,同时该标准对舍入规则也做了约定。

默认情况下,使用 Math.Round 方法时执行的舍入规则,主要是中值的舍入规则,根据官方文档说明是按 IEEE 754 中,“中值舍入为最接近的偶数”进行处理的。

文档地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.math.round#midpoint-values-and-rounding-conventions

IEEE 754 标准:https://zh.wikipedia.org/wiki/IEEE_754#%E6%B5%AE%E9%BB%9E%E6%95%B8%E7%9A%84%E6%8D%A8%E5%85%A5

 

> 详细解释

至于为什么默认按此标准执行,找到了网上的一篇解释,觉得比较清晰,转载如下:

当有两个最接近的可表示的值时首选“偶数”值,这与我们常见的“四舍五入”只有一点不同,对.5的舍入上,采用取偶数的方式。
如:

Round(0.5) = 0;
Round(1.5) = 2;
Round(2.5) = 2;

对比采用四舍五入:

Round(0.5) = 1;
Round(1.5) = 2;
Round(2.5) = 3;

之所以IEEE754要这么做,主要是因为浮点数在计算机中存放的位数有限,其表示精度有限,所以必然有部分浮点数无法精确表示,对于这部分浮点数我们就需要舍入处理。但是对于.5,它到0和1的距离一样近,如果我们按照四舍五入的方式舍入,则计算上的误差会一直叠加,为了平衡误差,我们需要等概率地取舍。从统计学角度看,二进制数舍入位的前一位是0或1的概率相等,至于为什么舍入取偶数而不是奇数,这是个历史问题。

原文链接:https://blog.csdn.net/qq_20480611/article/details/52564428

> 四舍六入五成双

然后又找到了百度百科在“四舍五入”的百科中,提到了一种叫“四舍六入五成双”的方法,这个方法应该跟上面描述的是同一种方法,所以这个不仅仅是在计算机处理浮点数时的规则,在执行任何小数处理时,这都是一种比较科学的处理方法。

百科链接:https://baike.baidu.com/item/%E5%9B%9B%E8%88%8D%E5%85%AD%E5%85%A5%E4%BA%94%E6%88%90%E5%8F%8C

原文地址:https://www.cnblogs.com/xwgli/p/14269604.html