【问题标题】:Rounding necessary with BigDecimal numbers使用 BigDecimal 数字进行四舍五入
【发布时间】:2012-05-24 08:58:43
【问题描述】:

我想设置两个 BigDecimal 数字的比例 ab 。如本例所示:

BigDecimal a = new BigDecimal("2.6E-1095");
        BigDecimal b = new BigDecimal("2.7E-1105");
        int i = 112, j=1;

        BigDecimal aa = a.setScale(i+j);
        BigDecimal bb = b.setScale(i+j);

当我运行时,我遇到了这个异常:

java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439)
    at java.math.BigDecimal.setScale(BigDecimal.java:2394)
    at java.math.BigDecimal.setScale(BigDecimal.java:2437)

为什么需要四舍五入?如果我不想四处走动,请问有什么解决方案?

谢谢

【问题讨论】:

  • 确实是个惊喜。在不查看文档的情况下,我希望将比例设置为按比例截断......
  • 我期待同样的事情。甚至在指定 RoundingMode.ROUNDING_UNNECESSARY 时也会出现此异常。我没有看到截断选项,但希望有。

标签: java rounding bigdecimal


【解决方案1】:

您有两个 BigDecimal 数字,这两个数字都需要超过 1000 个小数位。尝试将比例设置为只有 113 位小数意味着您将失去精度,因此您需要四舍五入。

您可以使用采用 RoundingMode 的 setScale 方法来防止异常,但不能防止舍入。

【讨论】:

    【解决方案2】:

    尝试使用 setScale 方法的 roudingMode。

    类似的东西:

    BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
    

    【讨论】:

    • 我认为枚举应该是 RoundingMode.HALF_DOWN
    【解决方案3】:

    四舍五入是必要的。

    javadoc for BigDecimal 中,BigDecimal 表示为 (unscaledValue × 10-scale),其中 unscaledValue 是一个任意长整数,而 scale 是一个 32 位整数。

    2.6*10-1095 需要至少 1096 的比例才能准确表示。不能用(任意整数)*10-113准确表示。因此,您需要提供roundingMode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多