在 Java 中使用 DecimalFormat 进行舍入

2022-09-02 19:51: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));

它应该返回,但它返回。如何?32


答案 1

DecimalFormat 的默认舍入模式为 RoundingMode.HALF_EVEN。这意味着它会向上舍入,或者如果数字更接近下一个邻居,则向下舍入。当数字正好在两个邻居之间(在你的例子中,2和3)之间时,它会四舍五入到最接近的偶数(在你的情况下,2)。

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

如果你想要更“直观”的行为,被称为“校舍四舍五入”,因为它经常被教给孩子,使用RoundingMode.HALF_UP

setRoundingMode(RoundingMode.HALF_UP)

如果数字正好在两个邻居之间,则始终向上舍入。HALF_UP


答案 2

这是有意的行为。从文档中

舍入

DecimalFormat 使用半偶数舍入(请参见ROUND_HALF_EVEN)进行格式设置。

关于ROUND_HALF_EVEN

舍入模式以舍入为“最近邻”,除非两个相邻项都等距,在这种情况下,舍入为偶数邻点。如果丢弃分数左侧的数字是奇数,则表现为ROUND_HALF_UP;表现得像ROUND_HALF_DOWN,如果它是均匀的。请注意,这是舍入模式,可在对一系列计算重复应用时最大程度地减少累积误差。

这也称为银行家的舍入。

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

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

推荐