BigDecimal HALF_UP舍入问题

时间:2017-02-28 23:54:34

标签: java math rounding bigdecimal

我试图使用scale = 3和HALF_UP舍入模式来舍入0.14049并希望看到舍入值= 0.141但是得到0.140。

根据我的理解,最后一个十进制数字9应该向上舍入4到5,当使用比例3时,它应该反过来向上舍入0到1,我应该看到0.141。

这是BigDecimal setScale方法中的错误还是我对Rounding的期望是错误的。如何获得类似于0.141而不是0.140的舍入值?

BigDecimal bd=new BigDecimal("0.14049");
BigDecimal normalizedField = field.setScale(3, RoundingMode.HALF_UP);
System.out.println(normalizedField);
// Output = 0.140

2 个答案:

答案 0 :(得分:10)

  

根据我的理解,最后一个十进制数字9应该向上舍入4到5,当使用比例3时,它应该反过来向上舍入0到1,我应该看到0.141。

这种理解是不正确的。舍入不是一个迭代过程。只考虑刻度位置后的第一个数字,而不是整个数字链。在你的情况下,数字是4,所以它被转换为零。

答案 1 :(得分:0)

根据您的业务领域,“4999998”案例将始终位于同一位置。我有类似的情况,比例是2.所以我添加了额外的步骤四舍五入。在你的情况下:

BigDecimal bd=new BigDecimal("0.14049");
BigDecimal normalizedField = bd.setScale(4, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP);
System.out.println(normalizedField);