BigDecimal中Divide方法的Scale()

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

我在这里想念的是什么?

谢谢

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

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

它说“首选规模”并非“绝对是规模”。

为了绝对肯定,我会使用BigDecimal.divide(BigDecimal, int, int)