#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?