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

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

很感谢任何形式的帮助.

Ken*_*net 8

不要使用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
Run Code Online (Sandbox Code Playgroud)

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

  • 在这种情况下,没有,舍入到23是正确的.HALF_EVEN指定在小数部分为_exactly_ 0.5时舍入为偶数_only_,否则舍入为_nearest_整数. (2认同)