BigDecimal错误的舍入

时间:2015-10-15 13:22:12

标签: java rounding bigdecimal

我在使用BigDecimal的比例和RoundingMode舍入数字时遇到问题。

这是我的代码:

BigDecimal taxAmount = new BigDecimal("0.8445");
taxAmount = taxAmountPrecision.setScale(2, RoundingMode.HALF_UP);

如果我放0.845它很好,但如果有0.8445,则taxAmount为0.84。

应为0.8445 - > 0.845 - > 0.85。

2 个答案:

答案 0 :(得分:6)

这是该舍入方法的确切expected behavior

  

舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向上舍入。

0.8445到2位小数的最近邻居是0.84。如果值为0.845或更大(值之间的中间值),则HALF_UP将舍入为0.85,如果小于该值,则将舍入为0.844。 0.8445小于0.845,因此它向下舍入。

没有中间的舍入步骤来传播5,就像你想要的那样。如果你想要那种舍入,你将不得不写一个循环来循环以稳定地减少精度。

答案 1 :(得分:0)

为了达到理想的行为,您必须先将比例设置为3,然后设置为2:

BigDecimal taxAmount = new BigDecimal("0.8445");
taxAmount = taxAmount.setScale(3, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);

根据要求(例如您应该期望的小数位数),在循环中执行降低精度逻辑更有意义。