3

我正在使用在 java 应用程序中实现脚本引擎的开源项目 (axil),并且在尝试利用 BigDecimal 的舍入时遇到了一个主要的绊脚石。似乎 BigDecimal 正在将我的输入转换为科学记数法,然后将我传递的精度应用于数字的 SN 表示的系数,而不是它的非 SN 表示。例如:

new BigDecimal("-232454.5324").round(new MathContext(2, RoundingMode.HALF_UP)).toString()

产生 的结果-2.3E+5。这给我带来了两个问题。首先,我期待-232454.5( -2.324545E+5) 的结果,因此得到-230000抛出任何涉及结果的数学。其次,我不期望,也找不到解决方法,在 SN 中获得结果(尽管我希望有一种我还没有偶然发现的格式化方法)。

现在由于项目的性质,我们可以对传入 round() 方法的数字的大小/类型做出很少的期望,因此任何解决方案都需要高度模块化。有没有人有什么建议?如果有帮助,这里是项目中此错误的谷歌代码问题报告的链接。 这是项目主页的链接。

很感谢任何形式的帮助。

4

3 回答 3

9

不要使用 round 方法,而是使用 setScale,其中参数是小数位数:

BigDecimal bd = new BigDecimal("-232454.5324").setScale(1,
                RoundingMode.HALF_UP);
String string = bd.toPlainString();
System.out.println(string); // prints -232454.5

另请注意, setScale 返回一个新的 BigDecimal 实例,它不会更改当前实例的比例。

于 2012-06-04T15:02:08.143 回答
1

AMathContext采用精度,它是结果中有效数字的总数(小数位之前和之后)。 BigDecimal的逻辑在这里是正确的。

于 2012-06-04T18:46:01.630 回答
1

我会这样做:

BigDecimal number = new BigDecimal("22.2222").setScale(0, RoundingMode.UP);

if (number.intValue() % 2 != 0) {
    number = number.add(BigDecimal.ONE);
}

System.out.println(number); // => 24
于 2012-06-04T15:46:57.583 回答