Попытка рассчитать ежемесячные выплаты с помощью расчетов BigDecimal - PullRequest
1 голос
/ 05 апреля 2019

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

Мне сказали использовать математическую систему BigDecimal, так как примитивный тип двойных данных недостаточно точен для финансовыхвычисления.

Шаги, которые я делаю, пытаются подражать этой формуле: M = P [i (1 + i) ^ n / 1- (1 + i) ^ n]

BigDecimal iRateInput = BigDecimal.valueOf(iRate);
BigDecimal twelve = new BigDecimal("12"); 
BigDecimal iRateMonthly = iRateInput.divide(twelve); 
BigDecimal one = new BigDecimal ("1"); 
BigDecimal iRateTemp = iRateMonthly.add(one);
BigDecimal loanTermBD = BigDecimal.valueOf(loanTerm);
loanTermBD = loanTermBD.multiply(twelve); 
BigDecimal iRatePower = iRateTemp.pow(loanTerm); 
BigDecimal iRateTop = iRateMonthly.multiply(iRatePower);
BigDecimal iRateBottom = iRatePower.subtract(one);
BigDecimal iRateTotal = iRateTop.divide(iRateBottom, BigDecimal.ROUND_UP);
BigDecimal borrowAmountBD = BigDecimal.valueOf(borrowAmount);
BigDecimal repayments = borrowAmountBD.multiply(iRateTotal);

Я тестировал этот код с:

P = 100 000

n = 15 лет (* 12)

r = 0,06p / a

Согласно моим расчетам, ежемесячное погашение должно быть 843,86, но я получаю 6936,43

Помощь будет принята с благодарностью!<3 </p>

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Не понимаю, зачем вам здесь использовать BigDecimal

private static double calculateRatePower(double rate, int period) {
  return Math.pow(1.0 + rate/12.0, period * 12.0);
}

public static void main(String[] args) throws IOException {
  double iRate = 0.06;
  double borrowAmount = 100000.0;
  int loanTerm = 15;

  double top = (iRate / 12.0) * calculateRatePower(iRate, loanTerm);
  double bottom = 1 - calculateRatePower(iRate, loanTerm);

  double repayments = borrowAmount * (top/bottom);
  System.out.println(repayments);
}

выполнение этого приводит к

-843,8568280484624

Если вы все еще хотите использовать BigDecimal, я предлагаю сделать некоторые вещи в отдельных методах для более читабельного кода

private static BigDecimal ratePerMonth(double rate) {
  return BigDecimal.valueOf(rate).divide(BigDecimal.valueOf(12), 20, RoundingMode.DOWN);
}

private static BigDecimal calculateRatePower(double rate, int period) {
  BigDecimal onePlus = BigDecimal.ONE.add(ratePerMonth(rate));
  return onePlus.pow(period * 12);
}

public static void main(String[] args) throws IOException {
  double iRate = 0.06;
  double borrowAmount = 100000.0;
  int loanTerm = 15;

  BigDecimal top = ratePerMonth(iRate).multiply(calculateRatePower(iRate, loanTerm));
  BigDecimal bottom = BigDecimal.ONE.subtract(calculateRatePower(iRate, loanTerm));
  BigDecimal ratio = top.divide(bottom, 20, RoundingMode.DOWN);

  BigDecimal repayments = BigDecimal.valueOf(borrowAmount).multiply(ratio);
  System.out.println(repayments);
}

что дает

-843,856828048451310000000

0 голосов
/ 05 апреля 2019

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

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

...