开发者

Scale() of Divide method in BigDecimal

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

This returns 10. But according to the API, the divide开发者_Go百科 method:

Returns a BigDecimal whose value is (this / divisor), and whose preferred scale is (this.scale() - divisor.scale());

So in this case, 37146555.53880000's scale is 8, and 1000000's scale is 0. So the result should have a scale of 8, not 10.

What am I missing here?

Thanks


The actual result is 37.1465555388 whose scale must be 10 for it to be exact.

What the JavaDoc says is that the preferred scale is the difference meaning that if the result didn't actually need to be 10, then it would try to make it 8. For example if you would have divided by 2, whose scale is also 0, the result would have been 18573277.76940000 (scale 8).

EDIT: small addition - you can force the division to a certain scale by using the overloaded divide methods:

  • divide(BigDecimal, RoundingMode) that will give a BigDecimal with scale of this and value rounded using the specified rounding method if the result would actually need more decimals to be exact.

  • divide(BigDecimal, scale, RoundingMode) that will give a BigDecimal with specified scale, and value rounded by specified method if needed.

This might be useful if you're dividing by a number you know can cause repeating decimals, like 3 (1/3 = 0.333333...) since, if that happens, the simple divide will throw an exception. Bounding it to a maximum number of decimals will help you avoid the exception but will make your computations less precise.


These scales are the ones used by the methods which return exact arithmetic results; except that an exact divide may have to use a larger scale since the exact result may have more digits. For example, 1/32 is 0.03125.


It says "preferred scale" not "definitely will be scale".

To be absolutely sure, I would use BigDecimal.divide(BigDecimal, int, int).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜