为什么BigDecimal没有按预期舍入

时间:2013-09-23 11:32:25

标签: java rounding bigdecimal

下面的代码将1620除以100得到结果16.00而不是16.20的预期值。

MathContext mc = new MathContext(2, RoundingMode.HALF_EVEN);

BigDecimal num = new BigDecimal("1620").setScale(2, RoundingMode.HALF_EVEN);
BigDecimal divider = new BigDecimal(100).setScale(2,RoundingMode.HALF_EVEN);

BigDecimal result = num.divide(divider, mc).setScale(2, RoundingMode.HALF_EVEN);

打印出上面的值

num:1620.00 分隔线100.00 结果:16.00

如果我将MathContext中的精度更改为4,我得到16.20的结果,但为什么?如果MathContext中的精度为2而不是16.20?

4 个答案:

答案 0 :(得分:2)

BigDecimal num = new BigDecimal("1620").setScale(2, RoundingMode.HALF_EVEN);
BigDecimal divider = new BigDecimal(100).setScale(2,RoundingMode.HALF_EVEN);

BigDecimal result = num.divide(divider).setScale(2,RoundingMode.HALF_EVEN);

只需五分钟即可完成我的答案,您通过设置MathContext(JAVADOC)MathContext(int precision,RoundingMode setRoundingMode)来设置精度为2。

2的精度,所以只有两位数。

希望有帮助

答案 1 :(得分:2)

Precission指定有效数字的总数,而不是该数字右边的数字。

检查此代码

MathContext mContext = new MathContext(2);
BigDecimal bd1 = new BigDecimal(1234, mContext);
BigDecimal bd2 = new BigDecimal(10, mContext);
System.out.println("Big " + bd1.divide(bd2).toPlainString()); // returns 120

这是有道理的,因为小数点的位置只是比例问题12.341.234+E1123.4-E1相同。

答案 2 :(得分:0)

它与总位数有关。使用round()而不是setScale()。

答案 3 :(得分:-1)

当您将2传递给MathContext的构造函数时,您显然会限制为除法计算的某些间歇值。我不知道这是否是API的意图......我猜不会。似乎是一个错误。

尽管如此,你还是有几个选择。

  1. 在MathContext的构造函数中将2更改为4,一切正常。
  2. 从代码中删除setScale和MathContext,简化它并使其更准确。如果你总是设置比例,你可能会根据输入切断有效数字。将精度和舍入模式直接添加到除法运算中。
  3. 代码示例:

     BigDecimal num = new BigDecimal("1620");
     BigDecimal divider = new BigDecimal(100);
     BigDecimal result = num.divide(divider, 2, RoundingMode.HALF_EVEN);
    

    这给了我16.20。