BigDecimal中Divide方法的Scale()

Sao*_*obi 6 java formatting bigdecimal

new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()
Run Code Online (Sandbox Code Playgroud)

这回来了10.但根据API,divide方法:

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

所以在这种情况下,37146555.53880000's规模是8,而且1000000规模是0.所以结果应该有一个规模8,而不是10.

我在这里错过了什么?

谢谢

And*_*anu 5

实际结果是 37.1465555388,其比例必须为 10 才能准确。

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

编辑:小加法 - 您可以使用重载的除法方法强制除法达到一定的规模:

  • divide(BigDecimal, RoundingMode)如果结果实际上需要更多的小数才能准确,这将给出一个使用指定的舍入方法舍入的BigDecimal比例this和值。

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

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