【问题标题】:Attempting to calculate monthly repayments with BigDecimal calculations尝试使用 BigDecimal 计算每月还款额
【发布时间】:2019-04-05 06:02:53
【问题描述】:

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

我们将不胜感激!

【问题讨论】:

    标签: java bigdecimal finance


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2016-05-06
      • 2018-08-09
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多