代码之家  ›  专栏  ›  技术社区  ›  tzortzik

BigDecimal和MathContext

  •  1
  • tzortzik  · 技术社区  · 7 年前

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

    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
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Slava Vedenin    7 年前

    因为在 MathContext(4, RoundingMode.CEILING) .divide(new BigDecimal(1.19), 4, RoundingMode.CEILING); ,4为刻度。您可以看到“精度”和“比例”之间的差异 here

    “之间的区别” 精确 “和” 在这两个声明中。" 精确 数字中的数字。" 规模 “是数字右边的位数 小数点。

    所以如果你把第二个换成

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

    1037.4520
    1037.4520