BigDecimal Деление с использованием значимых цифр - PullRequest
0 голосов
/ 20 сентября 2018

Я использую 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 https://stackoverflow.com/a/21443880
    public static int significantDigits(BigDecimal input) {
      input = input.stripTrailingZeros();
      return input.scale() < 0
        ? input.precision() - input.scale()
        : input.precision();
    }

Какой правильный способ программного определения шкалы для обеспечения правильного числа значащих цифр?

1 Ответ

0 голосов
/ 21 сентября 2018

Значимые цифры являются ситуативными, не вычисляются.Как вы упомянули в комментарии, вы делаете программу для пересчета процента решения с несколькими ингредиентами.Я предлагаю вам преобразовывать единицы ингредиентов до тех пор, пока у вас не останется значащих цифр справа от десятичной точки на входе, затем выполните вычисления.

Для этого вам нужно знать единицы на входе.Таким образом, если тестовый ввод выражен в «граммах», вы сначала преобразуетесь в миллиграммы (граммы * 1000).

Таким образом, числа будут 250 и 105000;затем выполните деление и сохраните 2 или 3 десятичных знака - меньше, чем обычно, не имеет смысла, когда на входе нет десятичных чисел.

...