使用Java中的BigDecimal进行舍入模式

Tin*_*iny 5 java rounding bigdecimal

以下代码使用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);
Run Code Online (Sandbox Code Playgroud)

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

和在以下情况下RoundingMode.HALF_UP, RoundingMode.UP是当被丢弃的小数部分是> = 0.5(其为真)进行的,否则RoundingMode.DOWN被执行.

Per*_*ion 13

Javadoc中描述了这种行为:

舍入模式向"最近邻居"舍入,除非两个邻居等距,在这种情况下,向着偶邻居舍入.

所以给出数字4.5,它在4到5之间的数字范围的正中间,当你打电话时:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN);
Run Code Online (Sandbox Code Playgroud)

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