在Java中使用DecimalFormat进行舍入

时间:2012-04-13 16:23:22

标签: java decimalformat

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

2 个答案:

答案 0 :(得分:16)

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相同,但如果数字恰好在两个邻居之间,则总是向上舍入。

答案 1 :(得分:13)

这是故意行为。来自the documentation

  

舍入

     

DecimalFormat使用半偶数舍入(请参阅ROUND_HALF_EVEN)进行格式化。

关于ROUND_HALF_EVEN

  

舍入模式向“最近邻居”舍入,除非两个邻居都是等距的,在这种情况下,向着偶邻居舍入。如果丢弃的分数左边的数字是奇数,则表现为ROUND_HALF_UP;如果它是偶数,则表现为ROUND_HALF_DOWN。请注意,这是一种舍入模式,可以在一系列计算中重复应用时最小化累积误差。

这也称为银行家的四舍五入。

另一方面,

Math.Round使用以下公式,即“正常”舍入:

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