1

下面的代码将 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);

打印出上面我得到的值

编号:1620.00 分频器 100.00 结果:16.00

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

4

4 回答 4

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,因此只有两位数。

希望有帮助

于 2013-09-23T11:44:29.823 回答
2

精度指定有效数字的总数,而不是该点右侧的数字。

检查此代码

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

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

于 2013-09-23T11:46:59.930 回答
0

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

于 2013-09-23T11:37:53.523 回答
-1

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

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

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

代码示例:

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

这给了我 16.20。

于 2013-09-23T11:46:27.820 回答