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