Java BigDecimal和MathContext

Java BigDecimal和MathContext,java,Java,有人能解释为什么这两种结果不同吗 BigDecimal bd1 = new BigDecimal(1234.5678) .divide( new BigDecimal(1.19), 4, RoundingMode.CEILING ); BigDecimal bd2 = new BigDecimal(1234.5678) .divide( new BigDecimal(1.19), new Ma

有人能解释为什么这两种结果不同吗

BigDecimal bd1 = new BigDecimal(1234.5678)
    .divide(
        new BigDecimal(1.19),
        4,
        RoundingMode.CEILING
    );
BigDecimal bd2 = new BigDecimal(1234.5678)
    .divide(
        new BigDecimal(1.19),
        new MathContext(4, RoundingMode.CEILING)
    );
结果

bd1: 1037.4520
bd2: 1038

因为在
MathContext(4,RoundingMode.天花)
中,4是精度,但在
中是除法(新的BigDecimal(1.19),4,RoundingMode.天花),4为刻度。您可以看到“精度”和“比例”之间的差异

有一个重要的要点被提到,但没有直接提到,那就是 “精度”和“比例”之间的差异及其使用方法 在这两个声明中。“精度”“是有效数据的总数 数字中的数字。“比例”是数字右边的位数 小数点

所以如果你把第二个换成

final BigDecimal bd2 = new BigDecimal(1234.5678)
        .divide(
                new BigDecimal(1.19),
                new MathContext(8, RoundingMode.CEILING)
        );
您得到了相同的结果:

1037.4520
1037.4520

我认为我为你准备的MCVE说明了问题?你让例子变得更糟了。如果可以避免,请不要对BigDecimal构造函数使用双文本。浮点精度使示例不那么清晰
1234.5678
将不会
1234.5678
@Michael这才是重点。我的真实例子是类似的。我有类似2074523.35687的东西作为输入,然后使用字符串