您的位置:首页 > 编程语言 > C#

C# 中的四舍五入算法及 MSDN 2005 中文版 Math.Round 勘误

2007-07-29 12:41 441 查看
(请注意...文中描述问题已经得到修补,本文内容仅供参考!)

直接用以下重载方法即可

return Math.Round(value, decimals, MidpointRounding.AwayFromZero);

感谢CSDN网友 comerliang 的发现 2009-03-05 补充

整理一篇旧帖子...

C# 中没有四舍五入函数,事实上我知道的程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法。

Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。Banker 舍入法在大量样本统计计算中精度明显比四舍五入高,因为四舍五入总是逢五进位,除非样本中保留精度位不出现5,否则结果必然偏大。

Math.Round 方法默认的也是 Banker 舍入法。

在 .NET 2.0 中 Math.Round 方法有几个重载方法:

Math.Round(Decimal, MidpointRounding)
Math.Round(Double, MidpointRounding)
Math.Round(Decimal, Int32, MidpointRounding)
Math.Round(Double, Int32, MidpointRounding)

将小数值舍入到指定精度。MidpointRounding 参数,指定当一个值正好处于另两个数中间时如何舍入这个值。

该参数是个 MidpointRounding 枚举。

此枚举有两个成员,MSDN 中的说明是:

AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。
ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。

注 意!这里关于 MidpointRounding.AwayFromZero 的说明是错误的!实际舍入为两个值中绝对值较大的值。不过 MSDN 中的例子是正确的,英文描述原文是 it is rounded toward the nearest number that is away from zero.

所以,要实现四舍五入函数,对于正数,可以加一个 MidpointRounding.AwayFromZero 参数指定当一个数字是其他两个数字的中间值时其舍入为两个值中绝对值较大的值,例:

Math.Round(3.45, 2, MidpointRounding.AwayFromZero)

不过对于负数上面的方法就又不对了,因此需要自己写个方法来处理:


double ChinaRound(double value, int decimals)




...{


if (value < 0)




...{


return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);


}


else




...{


return Math.Round(value, decimals, MidpointRounding.AwayFromZero);


}


}

实际编程中可以用一些更简单的小技巧来实现,如:

int(value + 0.5)

double.Parse(value.ToString("f1"))

等...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: