使用有效数字的 BigDecimal 除法

BigDecimal Division using Significant Figures

我正在使用 BigDecimal 进行除法。我希望将商四舍五入到正确的有效数字位数。

例如

  @Test
  public void testBigDDivision() {

    BigDecimal top = new BigDecimal("0.25");
    BigDecimal bottom = new BigDecimal("105");

    int topSigFig = significantDigits(top);
    int botSigFig = significantDigits(bottom);

    // evaluates to 2 in this example
    int scale = (topSigFig > botSigFig) ? botSigFig : topSigFig;

    BigDecimal quot = top.divide(bottom, scale, RoundingMode.HALF_UP);

    BigDecimal expected = new BigDecimal("0.0024");

    Assert.assertTrue(String.format("Got %s; Expected %s", quot, expected), 
      expected.compareTo(quot) == 0); // fails "Got 0.00; Expected 0.0024"
    }

    // stolen from 
    public static int significantDigits(BigDecimal input) {
      input = input.stripTrailingZeros();
      return input.scale() < 0
        ? input.precision() - input.scale()
        : input.precision();
    }

以编程方式确定小数位数以确保商具有正确的有效数字位数的正确方法是什么?

重要数字是情境性的,不可计算的。正如您在评论中提到的,您正在执行一个程序来重新计算包含多种成分的溶液的百分比。我建议你把配料的单位转换到输入的小数点右边没有有效数字,然后再计算。

为此,您需要知道输入中的单位。因此,如果测试输入为 "grams",您首先要转换为毫克 (grams*1000)。

因此数字将是 250 和 105000;然后进行除法并保留 2 或 3 个小数位 - 当输入没有小数时,少于这个数通常没有意义。