让我们来看看在Java中下面的语句。
System.out.println(new DecimalFormat("0").format(2.4)); //returns 2
System.out.println(new DecimalFormat("0").format(2.5)); //returns 2 <---Concentrate here
System.out.println(Math.round(2.5)); //returns 3
System.out.println(new DecimalFormat("0").format(2.6)); //returns 3
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4
在上面的语句,其他所有情况下都是除以下明显。
System.out.println(new DecimalFormat("0").format(2.5));
它应该返回3
,但它返回2
。 怎么样?
这是故意行为。 从文档 :
四舍五入
DecimalFormat的使用半连取整(请参阅ROUND_HALF_EVEN)进行格式化。
关于ROUND_HALF_EVEN :
舍入模式朝着“近邻”,除非两个相邻数字的距离相等,在这种情况下,轮对,甚至邻居。 表现为用于ROUND_HALF_UP如果数字到舍弃部分的左侧是奇数; 表现为ROUND_HALF_DOWN如果是偶数。 注意,这是舍入模式当在计算的序列重复施加最小化累积误差。
这也被称为银行家的舍入。
Math.Round
另一方面使用下面的公式,这是“正常的”舍入:
(long)Math.floor(a + 0.5d)
默认舍入模式DecimalFormat
是RoundingMode.HALF_EVEN
。 这意味着,它向上舍,或几轮下来,如果数字越接近下一个邻居。 当号码是(在你的情况,2和3)刚好两个邻国之间,其四舍五入为最接近的偶数(在你的情况,2)。
正如你所看到的,当你与3.5试了一下,四舍五入到4。
如果你想要更多的“直觉”的行为,呼吁setRoundingMode(RoundingMode.HALF_UP)
http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode )
这是一样的HALF_EVEN
,但如果人数都恰好是两个邻国之间,永远向上舍入。