Math.Round()方法的四舍五入(.NET)

Math.Round()方法的四舍五入(.NET) 

    先声明这个是在.NET环境下的,Java等语言并不是一样的(先前没声明导致有些使用Java的人都提出了疑问,呵呵~不好意思,我写的是.NET版的~~)

    今天做项目的时候遇到个问题,项目需要数字四舍五入。我立即想到Math.Round这个函数,在我的印象中它就是个四舍五入的函数,想都没想就套用上去了。

    结果我在测试的时候发现实际上并不是这样的。我测试的数据为0.4,0.6,0.5和1.5。发现其结果和预想的结果大不相同。0.4和0.6这个不用说没问题分别返回了0和1,没错。奇怪的是0.5这个值居然返回的是0,我一琢磨难道Math.Round函数是五舍六入不成??于是看了下1.5的返回值,按我上一步的推断应该返回1,结果恰恰返回了2!

    这回蒙了~ 马上打开网页,在MSDN上需求答案,果不其然!Math.Round这个函数的解释是将值按指定的小数位数舍入,并不就是四舍五入。这种舍入有时称为就近舍入或四舍六入五成双。(直接调果然不行~)

    那怎么办呢?继续往下看,如果 a 的小数部分正好处于两个整数中间,其中一个整数为偶数,另一个整数为奇数,则返回偶数。 这句话什么意思呢?
    敲代码实验:

  1. Math.Round(0.4)  //result:0
  2. Math.Round(0.6)  //result:1
  3. Math.Round(0.5)  //result:0
  4. Math.Round(1.5)  //result:2
  5. Math.Round(2.5)  //result:2
  6. Math.Round(3.5)  //result:4
  7. Math.Round(5.5)  //result:6
  8. Math.Round(6.5)  //result:6
  9. Math.Round(8.5)  //result:8
  10. Math.Round(9.5)  //result:10

    大家看出来了没,我就从就近舍入或四舍六入五成双这句话来理解,就近舍入?没说清楚,四舍五入!嗯,没错0.4和0.6结果都符合四舍六入要求,那么五成双什么意思呢?我听过,四舍六入五取偶的说法,实质上应该是一样的!五取偶是什么意思呢?五凑偶是说前面是奇数,进一位,是偶数舍掉。比如1.135,取小数点后2位,也就是说舍入位是5,把5舍掉成1.13,舍入位5前面是3,为奇,就进一为1.14。所以说,我们来看结果,发现没,当舍入位前面一位的值,如果是奇数的话,它就进1,如果是偶数的话,就舍!~原来是这样,简单的说就是奇进偶舍。

    其实在 VB, VBScript, C#, J#, T-SQL 中 Round 函数都是采用 Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。

    为什么要奇进偶舍呢?这就验证了MSDN中另外一句话的涵义:它可以将因单方向持续舍入中点值而导致的舍入误差降到最低。这样的好处是遇到5时进位的概率为50%,这样更科学。

   那我们如何去实现四舍五入这个功能呢?

  2话不说,继续翻阅MSDN,果然有可以实现的方法,请调用  Math.Round(Decimal, MidpointRounding) 重载!~哦,原来还有重载的方法可用,MidpointRounding在两个数字之间时如何舍入的规范,规范MidpointRounding中它有2个成员,一个是ToEven还有个是AwayFromZero

  1. //四舍五入 
  2. Math.Round(0.5,MidpointRounding.AwayFromZero)

    吃饭先~下午再研究下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值