为什么我已经四舍五入了,却得到了一个不终止的十进制扩展?

Why Am I Getting a Non-terminating decimal expansion when I am rounding up already?

好的,所以我正在尝试除以 2 个随机 BigDecimal 值。如果数字不均匀或不规则而不是取余数,我宁愿将它四舍五入到最接近的整数。但是,当我这样做时,我的网站崩溃了,并且出现以下错误。

原因:java.lang.ArithmeticException:非终止十进制扩展;没有可精确表示的小数结果。

如果我没有四舍五入数字,我会理解这种情况的发生,但因为我已经四舍五入,所以我不明白为什么会这样。

  BigDecimal cartQty= (testValue1).getQuantity().getValue();
  BigDecimal cartMultiplier = (testValue2).getQuantity().getValue();
  //below where it crashes so if 4/3 and the value is 1.333 I'd expect to get 2.
  BigDecimal TotalPackageInt=  cartQty.divide(cartMultiplier ).setScale(0, RoundingMode.UP);

您理解操作意图这一事实不会改变实际 Java 方法链的语义。

您的语句以 cartQty 开头,然后调用 divide(cartMultiplier)。只有 之后 returns 被 setScale(0, RoundingMode.UP) 调用其结果。如果除法抛出异常,那么你后面打算做什么就无所谓了。

鉴于这些是数量,您可以考虑使用 BigInteger 而不是 BigDecimal

告诉 BigDecimal 您在执行 divide 时希望如何舍入。像这样:

BigDecimal TotalPackageInt=  cartQty.divide(cartMultiplier, 0, RoundingMode.UP );