以下代码使用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
。 最佳答案
该行为在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。此外,请记住,关于四舍五入的确定取决于最终结果(而不是小数部分)如您所假设的那样,是大十进制数的整数)。关于java - Java中使用BigDecimal的舍入模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15352229/