Библиотека вычислений

#java #calculated-columns

#java #вычисляемые столбцы

Вопрос:

Мне нужно выполнить некоторые вычисления, подобные этому (упрощенный):

             amount1     amount2     amount3     amount4     total
            5000        500         1000        350         6850

3.55%       177.5       17.75       35.5        12.43       243.18
1.00%       50          5           10          3.5         68.5

-           4772.5      477.25      954.5       334.07      6538.32

16.66%      ....
...
  

Вычисления довольно просты; Но я не уверен, как мне лучше всего это реализовать.
Мне нужно не только иметь возможность извлекать и показывать общие результаты вычислений, но и каждое дополнительное вычисление.
Я могу создать метод для каждого подсчета и сгруппировать методы в один для общего вычисления.
например.:

 calcTotal1() {
    calcSub1()   calcSub2()   ... ;
}
  

Но мне было интересно, есть ли лучший способ реализовать это.
Это также должна быть небольшая библиотека, которая может использоваться различными программами.

Комментарии:

1. Хорошо, что вы спрашиваете. Денежные вычисления с процентами довольно сложны. Вы должны иметь общую точность округления в обоих измерениях вашей таблицы, а этого нелегко достичь…

2. верно, нужно разобраться в этом 🙂 Я думаю, что использование BigDecimal — это правильный путь?

3. Вы могли бы выполнять сами вычисления с помощью float / double, поскольку вы округляете значения вверх / вниз до ближайшего цента. Однако, если вы хотите оставаться на безопасной стороне, BigDecimal это тоже хорошая идея

Ответ №1:

Я думаю, ваше требование может быть удовлетворено с помощью массива вычисляемых процентов:

  public BigDecimal[] calculate(BigDecimal[] percentages, BigDecimal amount) {
     BigDecimal rolling = amount;
     BigDecimal[] result = new BigDecimal[percentages.length];
     for (int i = 0; i < percentages.length; i  ) {
        // We use null as a marker for subtotals
        if (percentages[i] != null) {
           result[i] = amount.multiply(percentages[i]).divide(new BigDecimal("100"), MathContext.DECIMAL128);
           rolling = rolling.add(result[i]);
        } else {
           // Insert the subTotal
           result[i] = rolling;
        }
     }
  

Пожалуйста, обратите внимание на использование BigDecimal s , хотя они используют немного больше памяти, это серьезно повлияет на правильность ваших цифр.

Используя null s в процентах[], вы можете указать строки, в которых должны быть распечатаны промежуточные итоги.

Ответ №2:

Примером является таблица, а таблицы лучше всего обрабатывать с помощью баз данных. Если это всего лишь часть более крупной программы, вы можете использовать базу данных в памяти, такую как SQLLite, HSql или любую другую реляционную базу данных.

Определите таблицу с разными столбцами, требуемыми для вычисления с create table помощью оператора.

Затем заполните таблицу данными, используя insert into оператор. Некоторые части вычисления могут быть выполнены на этом этапе, например, ввод значений для процентов, которые должны быть вычислены для каждой ячейки вставленной строки данных.

Наконец, извлеките данные, выполнив полное вычисление с помощью select from оператора.

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

Комментарии:

1. Хотя я согласен с идеей возможного делегирования этой работы базе данных, это не объясняет, как выполнять фактические вычисления с помощью SQL…

2. «Дайте человеку рыбу, и вы накормите его на день. Научите человека ловить рыбу, и вы накормите его на всю жизнь «. Китайская пословица

3. ОК. Но как выполнить вычисление процентов и их сумм по различным столбцам / строкам, например, в HSQLDB?