8
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()

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

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

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

我在这里想念什么?

谢谢

4

3 回答 3

7

实际结果是 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...),这可能很有用,因为如果发生这种情况,简单的除法将引发异常。将其限制为最大小数位数将帮助您避免异常,但会使您的计算不太精确。

于 2010-07-21T20:33:32.723 回答
1

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

于 2010-07-21T20:32:43.440 回答
0

它说“首选比例”而不是“肯定会是比例”。

可以肯定的是,我会使用BigDecimal.divide(BigDecimal, int, int).

于 2010-07-21T20:30:23.583 回答