Есть ли более чистый / простой способ написания этой формулы в коде? - PullRequest
1 голос
/ 08 апреля 2019

Мне нужно вернуть двойное значение. Это значение получено из этой формулы.

ежемесячные проценты = баланс * процентная ставка / 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;

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Вы знаете, что результат 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();
1 голос
/ 08 апреля 2019

Я настоятельно советую вам добавить немного точности в ваши 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();
}

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

...