BigDecimal中Divide方法的Scale()

时间:2010-07-21 20:24:53

标签: java formatting bigdecimal

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

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

  

返回值为的BigDecimal   (这/除数),谁的首选   比例是(this.scale() -   divisor.scale());

因此,在这种情况下,37146555.53880000's比例为81000000的比例为0。因此,结果的比例应为8,而不是10

我在这里缺少什么?

由于

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

  

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

答案 2 :(得分:0)

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

绝对确定,我会使用BigDecimal.divide(BigDecimal, int, int)