下面的代码将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?
答案 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.34
与1.234+E1
和123.4-E1
相同。
答案 2 :(得分:0)
它与总位数有关。使用round()而不是setScale()。
答案 3 :(得分:-1)
当您将2传递给MathContext的构造函数时,您显然会限制为除法计算的某些间歇值。我不知道这是否是API的意图......我猜不会。似乎是一个错误。
尽管如此,你还是有几个选择。
代码示例:
BigDecimal num = new BigDecimal("1620");
BigDecimal divider = new BigDecimal(100);
BigDecimal result = num.divide(divider, 2, RoundingMode.HALF_EVEN);
这给了我16.20。