Есть ли более чистый / простой способ записи этой формулы в коде?

#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();
}
  

Таким образом, код остается читаемым, но за это приходится платить определенную цену: есть больше строк кода!