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

时间:2013-03-12 02:25:34

标签: 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);

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

RoundingMode.HALF_UP的情况下,当丢弃的小数部分> = 0.5(这是真的)时执行RoundingMode.UP,否则执行RoundingMode.DOWN

1 个答案:

答案 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.另外,请记住,关于如何舍入的决定是基于最终结果将是什么(而不是在小十进制的小数部分,你似乎已经假设了。)