有点郁闷:MSDN文档中MidpointRounding.AwayFromZero的翻译错误

很早就知道 Math.Round 方法实际上并不是我们上学时学到的“四舍五入”,而是 IEEE 标准定义的“银行家舍入”算法,通俗说法是“四舍六入五成双”(1.5→2, 4.5→4)。

当需要用到“四舍五入”算法时,.NET 1.x 中是需要自己实现(比如一种思路:正数加0.5后Math.Floor,负数减0.5后Math.Ceiling)。.NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的“四舍五入”。即: Math.Round(4.5, MidpointRounding.AwayFromZero) = 5。

不过MSDN文档中这个MidpointRounding.AwayFromZero的描述是“当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。”弄的我很长时间没反应过来。

实际上从 .NET 2.0 发布以来,网上已经有很多人都指出了这个翻译错误(原文实际是 When a number is halfway between two others, it is rounded toward the nearest number that is away from zero.),实际上应该是取绝对值较大的值

可是很遗憾,.NET 3.0, .NET 3.5 的文档中,这个翻译错误依然没有改正。

P.S.附带地,你有没有注意过:Math.Floor(2.1) = 2 而 Math.Floor(-2.1) = -3,也就是所谓“向负无穷大方向舍入”; Math.Ceiling(2.1) = 3 而 Math.Ceiling(-2.1) = -2,也就是所谓“向正无穷大方向舍入”。比如说,Ceiling 的一个使用场景:一个袋子能装 10kg,则 21kg 货物需要三个袋子,如果是 -21kg 呢?Math.Ceiling 的上述行为,是否也不符合你的预期呢?

posted on 2009-06-15 11:53  破宝  阅读(1459)  评论(0编辑  收藏  举报

导航