14

让我们看一下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。如何?

4

2 回答 2

21

默认的舍入模式DecimalFormatRoundingMode.HALF_EVEN. 这意味着如果数字更接近下一个邻居,它会向上取整或向下取整。当数字恰好在两个邻居之间(在您的情况下为 2 和 3)时,它会四舍五入到最接近的偶数(在您的情况下为 2)。

如您所见,当您使用 3.5 进行尝试时,它四舍五入为 4。

如果您想要更“直观”的行为,即经常教给孩子们的“校舍舍入”,请使用RoundingMode.HALF_UP.

setRoundingMode(RoundingMode.HALF_UP)

如果数字正好在两个邻居之间,HALF_UP则总是向上取整。

于 2012-04-13T16:27:53.750 回答
16

这是故意行为。从文档中

四舍五入

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

关于ROUND_HALF_EVEN

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

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

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

(long)Math.floor(a + 0.5d)
于 2012-04-13T16:27:26.213 回答