C#Rounding MidpointRounding.ToEven vs MidpointRounding.AwayFromZero

时间:2011-09-09 10:41:06

标签: c# rounding-error

在C#中,两个小数舍入策略MidpointRounding.ToEvenMidpointRounding.AwayFromZero的准确性是否存在差异?我的意思是两者都确保在四舍五入的数字中均匀分布,或者是一个舍入策略而不是表示与另一个相比的舍入数字?

2 个答案:

答案 0 :(得分:32)

来自MSDN:

默认情况下,Math.Round使用MidpointRounding.ToEven。大多数人不熟悉“四舍五入”作为替代方案,“从零开始四舍五入”更常见于学校。 .NET默认为“舍入到均匀”,因为它在统计上是优越的,因为它不会分享“从零舍入”的趋势,而是比向下舍入更频繁地舍入(假设舍入的数字往往是正数)。 )

根据数据集,对称算术舍入可能会引入主要偏差,因为它总是向上舍入中点值。举一个简单的例子,假设我们想要确定三个值1.5,2.5和3.5的平均值,但我们想在计算它们的平均值之前首先将它们四舍五入到最接近的整数。请注意,这些值的真实平均值是2.5。使用symmetic算术舍入,这些值变为2,3和4,它们的平均值为3.使用银行家舍入,这些值变为2,2和4,它们的平均值为2.67。因为后一种舍入方法更接近三个值的真实均值,所以它提供的数据损失最小。

http://msdn.microsoft.com/en-us/library/system.math.round.aspx

答案 1 :(得分:2)

如果您的值为 123.45 ,则

  

123.5 <-MidpointRounding.AwayFromZero
  123.4 <-MidpointRounding.ToEven