先声明这个是在.NET环境下的,Java等语言并不是一样的.
今天遇到个问题,项目需要数字四舍五入。立即想到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,如果是奇数的话,就舍!~原来是这样。