我是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);
我不知道为什么它似乎不起作用所以任何帮助都会被贬低
答案 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)))