6

以下代码使用RoundingMode.HALF_EVEN,

BigDecimal value1 = new BigDecimal("4.5");
value1=value1.setScale(0, RoundingMode.HALF_EVEN);

BigDecimal value2 = new BigDecimal("6.5");
value2=value2.setScale(0, RoundingMode.HALF_EVEN);

System.out.println(value1+"\n"+value2);

分别显示46。在我看来,它应该分别显示5和,7因为丢弃的小数部分(在这种情况下为 5)左侧的数字是奇数。在这种情况下,它执行RoundingMode.HALF_UP

在 的情况下RoundingMode.HALF_UPRoundingMode.UP当丢弃的小数部分 >=0.5(这是真的)时执行,否则RoundingMode.DOWN执行。

4

1 回答 1

15

该行为在Javadoc中有很好的描述:

舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下,向偶数邻居舍入

因此,给定数字 4.5,它正好位于 4 到 5 之间的数字范围的中间,当您调用时:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN);

运行时也需要确定要舍入哪个邻居,也就是应该舍入到 4 还是 5?通常它会根据 4.5 更接近哪个值进行舍入,但在这种情况下它接近两个邻居。它不是随意选择最终结果,而是选择偶数。这是 的行为ROUND_HALF_EVEN。如果您愿意,您可以指定ROUND_HALF_UP最终结果是 5,而不是 4。另外,请记住,关于如何舍入的决定取决于最终结果(而不是小数部分)正如您所假设的那样,大十进制数)。

于 2013-03-12T02:28:12.573 回答