BigDecimal和MathContext

有人可以解释为什么这两个有不同的结果?

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)
    );

Result

bd1: 1037.4520
bd2: 1038

回答(1)

2 years ago

因为在 MathContext(4, RoundingMode.CEILING) 中,4是精度,但在 .divide(new BigDecimal(1.19), 4, RoundingMode.CEILING); 中,4是比例 . 你可以看到"precision"和"scale" here之间的区别

提到但未直接解决的一个重要问题是“精确”和“规模”之间的区别以及它们在两个陈述中的使用方式 . “precision”是数字中有效数字的总数 . “scale”是小数点右边的位数 .

所以,如果你改变第二个

final BigDecimal bd2 = new BigDecimal(1234.5678)
        .divide(
                new BigDecimal(1.19),
                new MathContext(8, RoundingMode.CEILING)
        );

你有相同的结果:

1037.4520
1037.4520