#java #math #double #bigdecimal
#java #математика #двойной #bigdecimal
Вопрос:
Мне нужно вернуть двойное значение. Это значение является производным от этой формулы.
ежемесячный процент = баланс * процентная ставка / 100,00 / 12,0
Из-за некоторых проблем с точностью я должен использовать BigDecimal во время вычисления и возвращать двойное значение (поскольку именно так представлены деньги).
Я попробовал приведенный ниже код, и он работает отлично, но выглядит довольно длинным и немного нечитаемым, если вы спросите меня.
double bal = 10, rate=2, hundred = 100.00, month = 12.0;
double monthInt= (BigDecimal.valueOf(bal).multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(hundred)).divide(BigDecimal.valueOf(month))).doubleValue();
return monthInt;
Комментарии:
1. Вы хотите всегда рассчитывать за весь год или есть возможность предоставить
month = 11.0
и, таким образом, рассчитать проценты только за январь-ноябрь?
Ответ №1:
Вы знаете, что результат balance * interest rate
всегда будет разделен на 100
и 12
. Таким образом, вы могли бы сохранить эти статические части вашей формулы в static
переменной.
private static final BigDecimal MONTH_IN_PERCENT = BigDecimal.valueOf(100 * 12);
А затем используйте это в своих вычислениях:
return BigDecimal.valueOf(bal).multiply(BigDecimal.valueOf(rate).divide(MONTH_IN_PERCENT).doubleValue();
И если вы можете это гарантировать bal * rate <= Long.MAX_VALUE
, вы можете использовать эту версию:
return BigDecimal.valueOf((long) bal * rate).divide(MONTH_IN_PERCENT).doubleValue();
Ответ №2:
Я настоятельно советую вам добавить некоторую точность в ваши BigDecimal
-подразделения. В противном случае вы можете получить ArithmeticException
сообщение о том, что точная точность не была предоставлена.
Сделайте что-то вроде этого
public static double calculateMonthlyInterest(BigDecimal balance, BigDecimal rate,
BigDecimal hundred, BigDecimal month) {
return balance.multiply(rate)
.divide(hundred, 2, BigDecimal.ROUND_HALF_UP)
.divide(month, 2, BigDecimal.ROUND_HALF_UP)
.doubleValue();
}
Или это (если вы хотите указать double
параметры):
public static double calculateMonthlyInterest(double balance, double rate,
double hundred, double month) {
BigDecimal b = new BigDecimal(balance);
BigDecimal r = new BigDecimal(rate);
BigDecimal h = new BigDecimal(hundred);
BigDecimal m = new BigDecimal(month);
return b.multiply(r)
.divide(h, 2, BigDecimal.ROUND_HALF_UP)
.divide(m, 2, BigDecimal.ROUND_HALF_UP)
.doubleValue();
}
Таким образом, код остается читаемым, но за это приходится платить определенную цену: есть больше строк кода!