舍入MidpointRounding.ToEven 与MidpointRounding.AwayFromZero

问题描述 投票:0回答:4

在C#中,两种小数舍入策略

MidpointRounding.ToEven
MidpointRounding.AwayFromZero
的精度有什么区别吗?我的意思是,两者都确保舍入到的数字之间均匀分布,还是一种舍入策略与另一种舍入策略相比,是否过度代表舍入数字?

c# rounding-error
4个回答
56
投票

来自 .NET 文档页面

Math.Round

https://learn.microsoft.com/en-us/dotnet/api/system.math.round#midpoint-values-and-rounding-conventions

默认情况下,

Math.Round
使用
MidpointRounding.ToEven
。大多数人不熟悉“四舍五入到偶数”作为替代方案,“从零舍入”在学校中更常见。 .NET 默认为“舍入为偶数”,因为它在统计上更优越,因为它不具有“从零舍入”的趋势,向上舍入的频率略高于向下舍入的频率(假设四舍五入的数字往往为正)。 )

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


16
投票

如果您的值为 123.45 那么

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


0
投票
1) .NET using MidpointRounding.ToEven for default method of Math.Round
2) MidpointRounding.ToEven will round off to upper limit if fraction value grater then 5
3) MidpointRounding.AwayFromZero will round off to upper limit if fraction value equal and grater then 5
4) for e.g. if we want to Round off 12.1250 in 2 digit with 2 fraction
Math.Round(12.1250,2,MidpointRounding.ToEven) => 12.12 (fraction value in 50)
Math.Round(12.1250,2,MidpointRounding.AwayFromZero) => 12.13

Math.Round(12.1251,2,MidpointRounding.ToEven) => 12.13 (fraction value in 51)
Math.Round(12.1251,2,MidpointRounding.AwayFromZero) => 12.13

0
投票
很抱歉打扰旧答案,但在已接受的答案中存在一些混乱。
( 1.5 + 2.5 + 3.5 ) / 3 = 2.5
学校舍入:( 2 + 3 + 4 ) / 3 = 3
“银行家”四舍五入:(我很困惑 1.5 和 2.5 如何变成 2, 2)
                ( 1 + 2 + 3 ) / 3 = 2
而且价值观仍然是正确的。如果我们要继续 
学校舍入 2.5 -> 3
银行家四舍五入 2.5 -> 2
因此,在示例中,没有清楚地理解为什么使用 MidpointRounding.ToEven 而不是 AwayFromZero。
我现在纠正自己。四舍五入到甚至不再让我困惑。因此,银行家四舍五入实际上很清楚 - 它四舍五入到最接近的偶数:
(1.5 -> 2) + (2.5 -> 2) + (3.5 -> 4) -> (2 + 2 + 4) / 3 = 2.6(7) -> 3
© www.soinside.com 2019 - 2024. All rights reserved.