您的位置:首页 > 其它

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

2008-12-02 15:14 387 查看
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)

吃饭先~下午再研究下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: