Math.Round()方法的四舍五入(.NET) 您所在的位置:网站首页 vb中四舍五入方法 Math.Round()方法的四舍五入(.NET)

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

2024-02-03 20:33| 来源: 网络整理| 查看: 265

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 的小数部分正好处于两个整数中间,其中一个整数为偶数,另一个整数为奇数,则返回偶数。 这句话什么意思呢?    敲代码实验:

Math.Round(0.4)  //result:0 Math.Round(0.6)  //result:1 Math.Round(0.5)  //result:0 Math.Round(1.5)  //result:2 Math.Round(2.5)  //result:2 Math.Round(3.5)  //result:4 Math.Round(5.5)  //result:6 Math.Round(6.5)  //result:6 Math.Round(8.5)  //result:8 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。

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

    吃饭先~下午再研究下



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有