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)
。