我在使用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。
答案 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);
根据要求(例如您应该期望的小数位数),在循环中执行降低精度逻辑更有意义。