如何处理Java的BigDecimal中的舍入错误

我正在使用在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()方法,因此任何解决方案都需要高度模块化。 有没有人有什么建议? 如果它有用,这里是项目中此错误的谷歌代码问题报告的链接。 这是项目主页的链接。

很感谢任何forms的帮助。

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

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

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

我会那样做:

 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 

MathContext采用精度 ,即结果中有效位的总数 – 小数位前后的总数BigDecimal的逻辑在这里是正确的。