在Java中的DecimalFormat四舍五入(Rounding with DecimalForm

2019-06-23 14:43发布

让我们来看看在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 。 怎么样?

Answer 1:

这是故意行为。 从文档 :

四舍五入

DecimalFormat的使用半连取整(请参阅ROUND_HALF_EVEN)进行格式化。

关于ROUND_HALF_EVEN :

舍入模式朝着“近邻”,除非两个相邻数字的距离相等,在这种情况下,轮对,甚至邻居。 表现为用于ROUND_HALF_UP如果数字到舍弃部分的左侧是奇数; 表现为ROUND_HALF_DOWN如果是偶数。 注意,这是舍入模式当在计算的序列重复施加最小化累积误差。

这也被称为银行家的舍入。

Math.Round另一方面使用下面的公式,这是“正常的”舍入:

(long)Math.floor(a + 0.5d)


Answer 2:

默认舍入模式DecimalFormatRoundingMode.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 ,但如果人数都恰好是两个邻国之间,永远向上舍入。



文章来源: Rounding with DecimalFormat in Java