以下代码使用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

最佳答案

该行为在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/

10-12 02:20