2015-10-15 78 views
1

我有一个使用BigDecimal的比例和RoundingMode四舍五入的问题。BigDecimal错误舍入

这是我的一段代码:

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。

+0

不,它是正确的。如果将数字四舍五入到小数点后第二位,则只考虑小数点后三位。不是第四个。所以0.844 - > 0.84 – Jens

+0

'Rounding.HALF_UP'取最近的邻居四舍五入。这是精确性和快速性之间的妥协。 – Cyrbil

+0

可能的重复:http://stackoverflow.com/questions/15352229/rounding-mode-with-bigdecimal-in-java – soorapadman

回答

6

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

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

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

没有中间舍入步骤来传播5像你想要的。如果你想要这样的四舍五入,你将不得不写一个循环来稳步减少精度。

0

为了达到所期望的行为,你必须规模起初设置为3,然后设置为2:

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

根据不同的要求(如小数号码,你应该期望),那么在循环中降低精度逻辑更有意义。