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)
吃饭先~下午再研究下
先声明这个是在.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)
吃饭先~下午再研究下
相关文章推荐
- .net Math.Round方法详解
- JavaScript中用于四舍五入的Math.round()方法讲解
- JavaScript中用于四舍五入的Math.round()方法讲解
- Math.Round方法真正意义上的四舍五入
- JavaScript基础 Math.round() 四舍五入成整数
- 面试题解析:5 Math.round()方法解析
- JS Math.round()方法原理
- Math.Round是四舍五入还是五舍六入
- Math.Round和四舍五入
- Math.Round 方法
- C#中Math.Round()实现中国式四舍五入
- Math类的round方法小解
- C#练习记录(请计算出一个整型数组的平均值。{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }。要求:计算结果如果有小数,则显示小数点后两位(四舍五入)。Math.Round())
- C#中Math.Round()实现中国式四舍五入
- Math.Round 之关于 不同的四舍五入
- asp.net小数点四舍五入的方法
- Java中Math类Math.floor()、Math.round()及Math.ceil()等方法的使用
- asp.net小数点四舍五入的方法
- js操作日期(函数,js版的dateAdd与dateDiff,四舍五入(round()方法)并保留小数点后N位的函数)
- C#中Math.Round()实现中国式四舍五入