比较不同利率的贷款java

时间:2015-03-20 15:19:14

标签: java for-loop nested-loops

我是Java新手,刚开始使用循环。

我试过这个练习:

编写一个程序,让用户以年数输入贷款金额和贷款期限,并显示每个利率的月付款和总付款,从5%到8%,增量为1/8。

到目前为止,我得到的是:

import java.util.Scanner;


public class compareLoansWithInterestRates {

public static void main(String[] args) {

    Scanner input = new Scanner (System.in);

    System.out.print("Loan Amount :");

    int loan = input.nextInt();

    System.out.print("Number of Years" );

    int years = input.nextInt();



    double  monthPay, totalPay,interestRate; 

System.out.println( "Interest Rate \t Monthly Payment \t Total Payment");

     for(double rate =0.05; rate <=0.08; rate++ ){
         for (int month = 1; month <= (years*12);month++){
        rate +=1/8;     
             monthPay = loan* rate/(1-(Math.pow(1+rate,years*12)));
             totalPay = monthPay*years*12;
             interestRate= rate*100;
             System.out.println("\t"+interestRate+" \t "+monthPay+"\t"+totalPay);

我不知道为什么它似乎不起作用所以任何帮助都会被贬低

5 个答案:

答案 0 :(得分:0)

只是简单地看一下你的代码,你就是使用rate ++(它将增加1而不是0.01)在'outer for'循环中递增速率。然后,您可以在月份循环内再次将速率提高1/8。尝试从外部循环中删除“rate ++”。这不是肯定的,这将解决你所有的问题,但这只是一个快速的观察。

答案 1 :(得分:0)

从哪里开始...

首先:Java:

for(double rate =0.05; rate <=0.08; rate++ ){

这对int来说很好,而不是对于double

rate +=1/8;     

1/8远远超过您正在寻找的0.125%。这不是Java,而是数学。

第二行不应该在这里,for循环应该是:

for(double rate =0.05; rate <=0.08; rate+=0.00125 ){

不幸的是,你的算法似乎也是错误的,所以这个改变不会解决所有问题。但从Java的角度来看,这将是相当不错的。

答案 2 :(得分:0)

我认为这会起作用

 for (double i = 5; i <= 8; i += 0.125) {
        double rate = i / 100;
        monthPay = loan * (Math.pow(1 + (rate / 12), years * 12)) / 12;
        totalPay = monthPay * years * 12;
        interestRate = i;
        System.out.println("\t" + interestRate + " \t " + monthPay + "\t" + totalPay);
    }

答案 3 :(得分:0)

我整理了一个与您的略有不同的简单贷款计算器,向您展示Java应用程序的输入和输出需要做多少工作。

这是输入和输出。

Loan Amount 60000
Number of Months 60
Yearly Interest Rate 6

Payments on a $60,000.00 loan for 60 months

          Monthly Payment  Total Payment
 4.000%         $1,104.99     $66,299.48
 4.250%         $1,111.77     $66,706.40
 4.500%         $1,118.58     $67,114.87
 4.750%         $1,125.41     $67,524.88
 5.000%         $1,132.27     $67,936.44
 5.250%         $1,139.16     $68,349.54
 5.500%         $1,146.07     $68,764.18
 5.750%         $1,153.01     $69,180.37
 6.000%         $1,159.97     $69,598.09
 6.250%         $1,166.96     $70,017.34
 6.500%         $1,173.97     $70,438.13
 6.750%         $1,181.01     $70,860.46
 7.000%         $1,188.07     $71,284.31
 7.250%         $1,195.16     $71,709.70
 7.500%         $1,202.28     $72,136.61
 7.750%         $1,209.42     $72,565.06
 8.000%         $1,216.58     $72,995.02

这是执行实际贷款计算以获取每月金额的代码。

private double calculateMonthlyPayment(double interestRate) {
    double monthlyInterestRate = interestRate / 12D;
    double numerator = (double) loanAmount * (monthlyInterestRate);
    double denominator = Math.pow(1 + (monthlyInterestRate),
            (double) -months);
    denominator = 1D - denominator;
    return numerator / denominator;
}

非常简单,对。

现在,我将向您展示收集输入并生成输出的所有代码。它比计算更长。尽可能详细地阅读代码,我会尽力解释。

package com.ggl.testing;

import java.text.NumberFormat;
import java.util.Scanner;

public class InterestRateCalculator implements Runnable {

    private static final NumberFormat CF = NumberFormat.getCurrencyInstance();
    private static final NumberFormat NF = NumberFormat.getNumberInstance();

    private double interestRate;

    private int loanAmount;
    private int months;

    @Override
    public void run() {
        getInputs();
        produceOutputs();
    }

    public void getInputs() {
        Scanner input = new Scanner(System.in);
        System.out.print("Loan Amount ");
        loanAmount = input.nextInt();
        System.out.print("Number of Months ");
        months = input.nextInt();
        System.out.print("Yearly Interest Rate ");
        interestRate = input.nextDouble();
        input.close();
    }

    public void produceOutputs() {
        double[] interestRates = new double[17];

        double interestRate = this.interestRate - 2.0D;
        for (int i = 0; i < interestRates.length; i++) {
            interestRates[i] = interestRate / 100D;
            interestRate += 0.25D;
        }

        String header = displayHeader();
        System.out.println(" ");
        System.out.println(header);

        System.out.print(leftPad(" ", 10, ' '));
        System.out.print(leftPad("Monthly Payment", 15, ' '));
        System.out.println(leftPad("Total Payment", 15, ' '));

        for (int i = 0; i < interestRates.length; i++) {
            String s = displayInterestRate(interestRates[i]) + "   ";
            System.out.print(leftPad(s, 10, ' '));
            double monthlyPayment = calculateMonthlyPayment(interestRates[i]);
            System.out.print(leftPad(CF.format(monthlyPayment), 15, ' '));
            double totalPayment = monthlyPayment * months;
            System.out.print(leftPad(CF.format(totalPayment), 15, ' '));
            System.out.println("");
        }
    }

    private double calculateMonthlyPayment(double interestRate) {
        double monthlyInterestRate = interestRate / 12D;
        double numerator = (double) loanAmount * (monthlyInterestRate);
        double denominator = Math.pow(1 + (monthlyInterestRate),
                (double) -months);
        denominator = 1D - denominator;
        return numerator / denominator;
    }

    private String displayHeader() {
        StringBuilder builder = new StringBuilder();

        builder.append("Payments on a ");
        builder.append(CF.format(loanAmount));
        builder.append(" loan for ");
        builder.append(NF.format(months));
        builder.append(" months");
        builder.append(System.getProperty("line.separator"));

        return builder.toString();
    }

    private String displayInterestRate(double interestRate) {
        return String.format("%.3f", interestRate * 100D) + "%";
    }

    private String leftPad(String s, int length, char padChar) {
        if (s.length() > length) {
            return s.substring(0, length);
        } else if (s.length() == length) {
            return s;
        } else {
            int padding = length - s.length();
            StringBuilder builder = new StringBuilder(padding);

            for (int i = 0; i < padding; i++) {
                builder.append(padChar);
            }
            builder.append(s);

            return builder.toString();
        }
    }

    public static void main(String[] args) {
        new InterestRateCalculator().run();
    }

}

我做的第一件事是使用InterestRateCalculator类作为Java对象。我的静态main方法由一行组成。

        new InterestRateCalculator().run();

这一行做了两件事。它创建一个InterestRateCalculator类的实例,并执行该类的run方法。

现在看起来很奇怪,但是远离静态方法和静态字段允许您创建具有许多类的复杂Java应用程序。在编写简单的应用程序时,您应该立即学习。

我实现了Runnable,因为Runnable类需要run()方法。这是我的个人偏好。您可以将run()方法命名为execute(),或其他一些有意义的名称。

我没有写一个构造函数。我使用了InterestRateCalculator();

的默认构造函数

现在看一下run()方法,我将问题分成两部分。读取或获取输入并生成输出。这使我可以专注于比原始问题更小,更简单的问题。这被称为分而治之。

获得输入很简单。我复制了你的代码并使提示文本保持一致。我在每个提示的末尾添加了一个空格,以便提示和响应看起来更好。我知道这听起来很傻,但我向你保证,我在编程生涯中花了大部分时间来改变应用程序输入和输出的外观。

将输出排成一行需要很大一部分代码来生成输出。产生输出比收集输入更复杂。我把这个过程分解成了很多方法。一个方法应该做一件事,并返回一个输出,就像我之前展示的calculateMonthlyPayment。

我使用了在Cobol编程的旧时代学到的技巧来产生输出。我用空格填充了我创建的字符串。你不必记住这个特殊的技巧。其他“技巧”已聚集在一起,称为设计模式。现在不要担心学习任何模式。只要知道它们存在,就可以将代码分组到更高的级别。

我希望这个解释对你有所帮助。我知道你想自己编写代码。这就是为什么我解决了与你不同的问题。祝你学习编程好运。

答案 4 :(得分:-1)

monthpay不正确

monthPay = loan* rate/(1-1/(Math.pow(1+rate,years*12)))