BigDecimal 中 Divide 方法的 Scale()

新手上路,请多包涵
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()

这将返回 10 。但是根据 API, divide 方法:

返回一个 BigDecimal,其值为 (this / divisor),其首选比例为 (this.scale() - divisor.scale());

So in this case, 37146555.53880000's scale is 8 , and 1000000 ’s scale is 0 .所以结果的比例应该是 8 ,而不是 10

我在这里错过了什么?

谢谢

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

阅读 1.4k
2 个回答

实际结果为 37.1465555388,其小数位数必须为 10 才能准确。

JavaDoc 所说的是首选比例是差异,这意味着如果结果实际上不需要为 10,那么它会尝试将其设为 8。例如,如果您除以 2,其比例也是 0 ,结果将是 18573277.76940000(比例 8)。

编辑:小加 - 您可以使用重载的除法将除法强制到一定比例:

  • divide(BigDecimal, RoundingMode) 这将给出一个 BigDecimal 比例为 this 如果结果实际上需要精确的舍入方法,则使用指定的舍入方法舍入值。

  • divide(BigDecimal, scale, RoundingMode) 这将给出一个 BigDecimal 具有指定的比例,如果需要,值通过指定的方法四舍五入。

如果您除以一个您知道会导致重复小数的数字,例如 3 (13 = 0.333333…),这可能会有用,因为如果发生这种情况,简单的除法将引发异常。将其限制为最大小数位数将帮助您避免异常,但会使您的计算不那么精确。

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

这些尺度是返回精确算术结果的方法所使用的尺度; 除了精确的除法可能必须使用更大的比例,因为精确的结果可能有更多的数字。例如,1/32 是 0.03125。

原文由 Peter G. 发布,翻译遵循 CC BY-SA 2.5 许可协议

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