在贷款计算器程序的数学上遇到麻烦

时间:2018-10-27 20:13:17

标签: java

这是一个贷款计算器程序。我在数学上遇到麻烦。除2个月后的期初余额外,其他所有内容似乎都是正确的。请注意,第3个月的期初余额与第2个月的期末余额不同。接下来的几个月也一样。我一直在尝试修复它,但是一切都没有解决。我需要它们保持相同,以便上个月的期末余额为0。

这是程序的示例输出:

Personal Loan Payment Calculator

Enter a loan amount: 1000
Enter the loan term (months): 6
Enter the interest rate (% per year): 9             

                Loan Payment and Amortization Table

   Months  Beginning    Monthly  Principal   Interest     Ending    
             Balance     Payment     Paid        Paid     Balance

        1    1000.00     171.07     163.57       7.50     836.43
        2     836.43     171.07     164.80       6.27     671.64
        3     670.41     171.07     166.04       5.03     504.37
        4     501.88     171.07     167.30       3.76     334.57
        5     330.78     171.07     168.59       2.48     162.19
        6     157.06     171.07     169.89       1.18     -12.83



Summary:
========
Loan Amount:           $1,000.00
Monthly Payment:       $171.07
Number of Payments:    6
Total Interest Paid:   $24.00
Annual Interest Rate:  9.00%

这是程序:

 public class LoanCalculator {

    public static void main(String[] args) {
            System.out.println("Personal Loan Payment Calculator"); // print the name of the program
            System.out.println("================================");
            Scanner keyboard = new Scanner (System.in); // define a Scanner object attached to a keyboard
            String badInput; // assign non-integer or non-double inputs to badInput

            System.out.print("Enter a loan amount: "); // prompt the user to enter loan amount
            while ( ! keyboard.hasNextDouble()) // is the first input value a double?
            {
                badInput = keyboard.next();
                System.out.println("Error: expected a Double, encountered: " + badInput);
                System.out.println("Please enter a loan amount in Double: ");
            }
            double loanAmount = keyboard.nextDouble(); // assign the first input to loanAmount

            System.out.print("Enter the loan term (months): "); // prompt the user to enter number of months
            while ( ! keyboard.hasNextInt()) // is the second input value an int?
            {
                badInput = keyboard.next();
                System.out.println("Error: expected an Integer, encountered: " + badInput);
                System.out.println("Please enter a loan term in Integer: ");
            }
            int loanTerm = keyboard.nextInt(); // assign the second input to loanTerm

            System.out.print("Enter the interest rate (% per year): "); // prompt the user to enter the interest rate
            while ( ! keyboard.hasNextDouble()) // is the first input value a double?
            {
                badInput = keyboard.next();
                System.out.println("Error: expected an integer, encountered: " + badInput);
                System.out.println("Please enter a loan amount in Double: ");
            }
            double interestRate = keyboard.nextDouble(); // assign the third input to interestRate

            System.out.println(); // skip a line

            System.out.println("             Loan Payment and Amortization Table");
            System.out.printf("%s", "=============================================================");
            System.out.println();
            System.out.printf("%5s %10s %10s %10s %10s %10s", "Months" ,"Beginning", "Monhtly", "Principal", "Interest", "Ending");
            System.out.println();
            System.out.printf(" %5s %10s %10s %10s %10s %10s", "#","Balance", "Payment", "Paid", "Paid", "Balance");
            System.out.println();
            System.out.printf("%s ", "=============================================================");
            System.out.println();

            double monthlyRate = (interestRate / 100.0) / 12.0;
            double monthlyPayment = (monthlyRate * loanAmount) / ( 1 - (Math.pow( 1 + monthlyRate, - loanTerm)));
            double beginningBalance = loanAmount;
            double interestPaid = beginningBalance * monthlyRate;
            double principalPaid = monthlyPayment - interestPaid;

            int total_interest_paid = 0;
            for (int monthCount = 0 ; monthCount < loanTerm ; ++monthCount)
            {
              int months = 1 + monthCount;
              beginningBalance = loanAmount - principalPaid * monthCount; 
              interestPaid = beginningBalance * monthlyRate;
              principalPaid = monthlyPayment - interestPaid;            
              double endingBalance = beginningBalance - principalPaid;
              System.out.printf(" %5d %10.2f %10.2f %10.2f %10.2f %10.2f\n", months, beginningBalance, monthlyPayment, principalPaid, interestPaid, endingBalance);

              total_interest_paid += interestPaid;
            }


            System.out.printf("%s ", "=============================================================");
            System.out.println();

            NumberFormat currency = NumberFormat.getCurrencyInstance();
            DecimalFormat percentFormat = new DecimalFormat ("0.00");

            System.out.println("\nSummary:");
            System.out.println("========");
            System.out.println("Loan Amount:           " + currency.format(loanAmount));
            System.out.println("Monthly Payment:       " + currency.format(monthlyPayment));
            System.out.println("Number of Payments:    " + loanTerm);
            System.out.println("Total Interest Paid:   " + currency.format(total_interest_paid));
            System.out.println("Annual Interest Rate:  " + percentFormat.format(interestRate) + "%");       
        }
}

1 个答案:

答案 0 :(得分:1)

错误非常简单:

<div class="some-class
   <img src="/img.89b1362f.png" alt="">
</div>

请记住,“ principalPaid”每月增加。支付的本金总额不是最后的PrincipalPaid * * count,而是所有月份支付的本金总额。

您可以像为已付利息所做的那样为principalPaid创建一个运行总计。 但是,开始beginBalance =上个月结束balance会更容易。