Math.Round 四舍五入函数

 
关于四舍五入的讨论和对   Round   函数的误解网上有很多,我在CSDN的第一帖就来说说这个简单问题,欢迎大家拍砖,呵呵

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

Banker 's   rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是   IEEE   规定的舍入标准。因此所有符合   IEEE   标准的语言都应该是采用这一算法的

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);
}
}
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值