尝试使用 BigDecimal 计算来计算每月还款额

Attempting to calculate monthly repayments with BigDecimal calculations

我是一个初学者,试图在 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

我不明白为什么你需要在这里使用 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