Java中BigDecimal的取舍模式

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,看起来应该分别显示57,因为舍弃的小数部分左侧的数字(本例中为5)是奇数。在这种情况下,它执行RoundingMode.HALF_UP
而在RoundingMode.HALF_UP的情况下,当舍弃的小数部分>=0.5时(为真),则执行RoundingMode.UP,否则执行RoundingMode.DOWN

46ROUND_HALF_EVEN 中是 偶数(EVEN).5一半(HALF) 的部分。 - Jim Garrison
2
为后人着想,我也读了几遍才理解。对我来说有意义的一个例子是,如果你要四舍五入6.5,那么你距离6和7相等。因为6是偶数,所以你选择了它。 - Craig Schmidt
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。此外,请记住,关于如何进行四舍五入的决定是基于最终结果而不是大十进制数的小数部分(正如您似乎所假设的那样)。


我没有理解这段引用的文字。 - Tiny
@Tiny,这意味着如果你在“半偶数”模式下要四舍五入的数字恰好落在奇数和偶数之间的中心范围内,那么四舍五入操作的结果将是偶数。 - Perception
如果可以的话,请用一个简单的例子来解释一下。我发现这个非常基础的东西很难理解,个人而言,我没有人可以请教帮助。 - Tiny
我在我的回答中添加了一些细节,希望能有所帮助。 - Perception
我正在使用Java 8。在BigDecimal中没有方法setScale(RoundingMode roundingMode),最接近的方法是setScale(int newScale, RoundingMode roundingMode),也没有变量RoundingMode.ROUND_HALF_EVEN。我猜测变量已经改变了。 - sanluck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接