Java BigDecimal中除法的Scale()

Java BigDecimal中除法的Scale(),java,formatting,bigdecimal,Java,Formatting,Bigdecimal,这将返回10。但是根据API,divide方法: 返回一个值为的BigDecimal (此/除数),以及谁的首选项 比例是(this.scale()- 除数。比例() 所以在这种情况下,37146555.53880000的比例是8,而1000000的比例是0。因此,结果的刻度应为8,而不是10 我错过了什么 谢谢上面写的是“首选量表”,而不是“肯定会是量表” 可以肯定的是,我会使用 这些天平是工程师们使用的 返回精确算法的方法 结果除了一个精确的除法 可能需要使用更大的比例尺,因为 确切的结果可

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

返回一个值为的BigDecimal (此/除数),以及谁的首选项 比例是(this.scale()- 除数。比例()

所以在这种情况下,
37146555.53880000的
比例是
8
,而
1000000
的比例是
0
。因此,结果的刻度应为
8
,而不是
10

我错过了什么

谢谢

上面写的是“首选量表”,而不是“肯定会是量表”

可以肯定的是,我会使用

这些天平是工程师们使用的 返回精确算法的方法 结果除了一个精确的除法 可能需要使用更大的比例尺,因为 确切的结果可能有更多的数字。 例如,1/32是0.03125


实际结果是37.146555388,其刻度必须为10才能精确

JavaDoc所说的是,首选的刻度是不同的,这意味着如果结果实际上不需要是10,那么它会尝试将其设为8。例如,如果除以2,其比例也为0,则结果将为18573277.76940000(比例8)

编辑:小平差-可以使用重载的除法将除法强制到一定的比例:

  • divide(BigDecimal,RoundingMode)
    将给出一个比例尺为
    this
    BigDecimal
    ,如果结果实际上需要更多的小数才能精确,则使用指定的舍入方法对值进行舍入

  • divide(BigDecimal,scale,RoundingMode)
    将给出一个具有指定比例的
    BigDecimal
    ,如果需要,可以使用指定方法对值进行四舍五入

如果你除以一个你知道的数字会导致重复的小数,比如3(1/3=0.333333…),这可能很有用,因为如果发生这种情况,简单的除法会抛出一个异常。将其限定为最大小数位数将有助于避免异常,但会降低计算精度。

如果此.scale()值小于除数.scale(),那么?
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()