以下代码使用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);
分别显示4
和6
。在我看来它应该分别显示5
和7
因为丢弃的小数部分左边的数字(在这种情况下是5)是奇数。在这种情况下,它执行RoundingMode.HALF_UP
在RoundingMode.HALF_UP
的情况下,当丢弃的小数部分> = 0.5(这是真的)时执行RoundingMode.UP
,否则执行RoundingMode.DOWN
。
答案 0 :(得分:13)
行为在Javadoc:
中有详细描述舍入模式以绕过最近邻居" 除非两者兼而有之 邻居是等距的,在这种情况下,是向着均匀的 邻居强>
所以给出数字4.5,当你打电话时,数字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.另外,请记住,关于如何舍入的决定是基于最终结果将是什么(而不是在小十进制的小数部分,你似乎已经假设了。)