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

时间:2019-04-05 06:02:54

标签: java bigdecimal finance

我是一个初学者,试图用Java创建一个小程序,该程序允许用户输入他们的贷款期限,利率等,并希望对每月还款额进行估算。但是,当我这样做时,它给我的数字与我手动计算的数字完全不同。

有人告诉我使用BigDecimal数学系统,因为原始的double数据类型不够精确,无法进行财务计算。

我正在执行的步骤正在尝试模仿此公式: 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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

简单的大十进制具有比十进制更大的精度,因为大十进制必须具有舍入模式,请尝试使用具有舍入值的构造函数。

但是BigDecimal为我们提供了准确的答案。 因此,请先尝试使用长整数和小数,然后先检查少量样本数据,然后确定问题出在哪儿。希望对您有帮助!