首页 文章

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

提问于
浏览
2

我正在使用在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()方法,因此任何解决方案都需要高度模块化 . 有没有人有什么建议? If it would be helpful here's a link to the google code issue report for this bug in the project. And here is a link to the project homepage.

很感谢任何形式的帮助 .

3 回答

  • 1

    不要使用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实例,它不会更改当前实例的比例 .

  • 9

    我会那样做:

    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
    
  • 1

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

相关问题