Math.round()的四舍五入问题
在java中我们通常用Math.round()来做四舍五入操作,但有时候结果却令人很难理解,例如下面的程序:
public static void main(String[] args) {
System.out.println(Math.round(11.5));
System.out.println(Math.round(-11.5));
}
按照正常的理解,结果应该是12和-12,但实际的输出却是:
12
-11
很显然这个结果与我们预想的结果有差别。那么问题出在哪呢?我们先看round()方法的底层实现:
public static long round(doublea) {
return (long)floor(a +0.5d);
}
从代码中,我们可以看到round(a)实际上等于Math.floor(a+0.5)。floor()方法意思是向下取整。floor(a)得到的是不大于a的最大整数。这个不大于就是上述问题产生的原因。round(-11.5)=floor(-11.5+0.5)=floor(-11.0),其结果便是-11(<=-11.0),而round(-11.6)=floor(-11.6+0.5)=floor(-11.1),其结果就是-12(<=-11.1)。
其它:与floor()对应的还有ceil()方法,ceil(a)是取不小于a的最小整数。如:ceil(-11.4)=-11.0,ceil(-11.5)=-11.0,ceil(-11.6)=-11.0, ceil(-11.0)=-11.0