关于 ROUND 函数
一
今天做项目的时候遇到个问题,项目需要数字四舍五入。我立即想到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 的小数部分正好处于两个整数中间,其中一个整数为偶数,另一个整数为奇数,则返回偶数。 这句话什么意思呢?
我是看了半天也没看明白,小数部分正好处于2个整数之间??难道小数部分后面还有数?那是什么数阿,反正我是没理解,没办法只能自己敲代码实验:
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,如果是奇数的话,就舍!~原来是这样。
MSDN的解释我是怎么看怎么也不明白了(诺有高人请赐教~)。那我们如何去实现四舍五入这个功能呢?
2话不说,继续翻阅MSDN,果然有可以实现的方法,请调用 Math.Round(Decimal, MidpointRounding) 重载!~哦,原来还有重载的方法可用,MidpointRounding在两个数字之间时如何舍入的规范,这是MSDN对其MidpointRounding所做的解释,在两个数字之间时这句我的理解是如果小数位最大值的一半的值,就像0.5这个5这个小数是所谓的中间值吧~反正是个规范,我们利用实现就可以了。规范MidpointRounding中它有2个成员,一个是ToEven还有个是AwayFromZero。
//四舍五入
Math.Round(0.5,MidpointRounding.AwayFromZero)
【转 自 http://www.zzzj.com/html/20081203/68596.html 】
二
下面来介绍将小数值舍入为整数的几个方法:Math.ceil()、Math.floor()和Maht.round()。这三种方法分别遵循下列舍入规则:
- Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数。
- Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数。
- Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数。
下面是使用这些方法的示例:
alert(Math.ceil(25.9)); //26
alert(Math.ceil(25.5)); //26
alert(Math.ceil(25.1)); //26
alert(Math.round(25.9));//26
alert(Math.round(25.5));//26
alert(Math.round(25.1));//25
alert(Math.floor(25.9));//25
alert(Math.floor(25.9));//25
alert(Math.floor(25.1));//25
对于所有介于25和26(不包括26)之间的数值,Math.ceil()始终返回26,因为它执行的是向上舍入。Math.round()方法只在数值上大于等于25.5时返回26;否则返回25。最后,Math.floor()对所有介于25和26(不包括26)之间的数值都返回25。
三
SQL 的round () 方法
特殊用法 ,整数位取整
如 round(14163,-1) 为 14160
round(14163 + 4.99 ,-1) 为 14170