是什么导致 BigDecimal.divide 出现“非终止小数扩展”异常?

新手上路,请多包涵

我以前使用过 BigDecimals 但不是很频繁,今天早上我正在做一些事情,我不断收到以下异常:

 Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1594)

我试图设置比例并使用舍入来消除这样的问题:

     BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("result: " + bd3);

但是,我不断收到相同的异常。任何人都可以告诉我我在哪里犯了错误?

原文由 ChadNC 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 685
2 个回答

非终止小数需要四舍五入

使用 divide 时,您应该使用 MathContextRoundingMode 以防精确结果有无限小数位数。

你的情况是这样的:

 MathContext mc = new MathContext(2, RoundingMode.HALF_UP) ;
BigDecimal bd3 = bd1.divide(bd2, mc);

或者使用舍入模式调用 divide 以使用分子的比例(以下示例中的 bd1 ):

 BigDecimal bd3 = bd1.divide(bd2, RoundingMode.HALF_UP);

原文由 assylias 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题是由会导致循环小数的操作(除法)引起的。

解决方法是在进行除法时指定一个 _尺度_,例如:

 BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
BigDecimal oneDivThree = one.divide(three, 200, RoundingMode.HALF_UP);

原文由 Neil Coffey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题