繁体   English   中英

BigDecimal错误舍入

[英]BigDecimal wrong rounding

我在使用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.8445到2位小数的最近邻是0.84。 如果值等于或大于0.845(值之间的一半),则HALF_UP将舍入为0.85;如果值小于该值,则将舍入为0.844。 0.8445小于0.845,因此将其舍入。

没有中间的舍入步骤可以传播所需的5 如果要进行这种舍入,则必须编写一个舍入循环以稳定降低精度。

为了实现所需的行为,您必须首先将比例尺设置为3,然后设置为2:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM