我创建了一个贷款支付计算器。每当我输入任何输入时,输出都会显示为NaN。我可以改变的任何想法。代码的第一部分是主要方法。第二个是另一个班级。
主要方法
import java.util.Scanner;
public class Assignment8 {
public static void main(String[] args) {
Scanner kbd = new Scanner(System.in);
System.out.print("Enter the amount borrowed: ");
double amountBorrowed = kbd.nextDouble();
System.out.print("Enter the interest rate: ");
int intRate = kbd.nextInt();
System.out.print("Enter the minimum length of loan: ");
int minLength = kbd.nextInt();
System.out.print("Enter the maximum length of loan: ");
int loanLength = kbd.nextInt();
while (loanLength < minLength) {
System.out.println("Invalid input: Input must be greater than minimum length of loan");
System.out.println("Enter the maximum length of loan: ");
loanLength = kbd.nextInt();
}
for (int i = minLength; i <= loanLength; i++) {
double payment = LoanCalc.monthlyPayment(amountBorrowed,loanLength, intRate);
System.out.println(payment);
}
}
}
CLASS
public class LoanCalc {
public static double monthlyPayment(double amountBorrowed, int loanLength, int intRate) {
double interestRate;
double monthlyPayment;
interestRate = intRate / 100 / 12;
monthlyPayment = (interestRate * amountBorrowed) / (1- Math.pow((1 + interestRate) , - loanLength * 12 ));
return monthlyPayment;
}
}
答案 0 :(得分:2)
我的第一个预感是NaN正在Math.pow引入,因为有一个巨大的列表条件会让它返回NaN - 看看实际输入值是。
而且,现在关于实际值 - interestRate
将是错误的(可能为0),因为整数除法正在完成。尝试:
interestRate = (double)intRate / 100 / 12;
答案 1 :(得分:1)
当您计算monthlyPayment
时,您将除以零。
因为在计算interestRate
时进行整数除法,所以最终得零。所以在下一行,你实际上正在做Math.pow(1, -loanLength * 12)
,它总是会给你1.你从1中减去结果并除以它。因此除以零。
您需要将intRate
参数设为double
,而不是int
,以便在计算interestRate
时不会得到整数除法。
你可以用演员表(根据目前在场的其他两个答案)来做这件事,但我认为你最好从头开始作为double
- 当你第一次宣布{ {1}}中的{1}},当您从扫描仪获取时,以及将其传递给intRate
时。{/ p>
答案 2 :(得分:1)
表达式interestRate = intRate / 100 / 12
正在执行整数除法。这些股息/除数都不会转换为十进制值,因此您得到0。
这使得这个表达很有趣:
Math.pow((1 + interestRate) , - loanLength * 12 )
结果是1(因为1到任何功率总是1)。你从中减去1得到0。
现在,something interesting happens当您在IEEE 754浮点值中除以零时 - 得到NaN
。
浮点除法的结果由规则确定 IEEE 754算术:
如果任一操作数为NaN,则结果为NaN。
如果结果不是NaN,则两者的结果符号均为正数 操作数具有相同的符号,如果操作数具有负数,则为负数 不同的标志。
用无穷大划分无穷大会导致NaN。
通过有限值划分无穷大会导致签名 无穷。该标志由上述规则决定。
通过无穷大划分有限值会导致有符号零。 该标志由上述规则决定。
将零除以零会导致NaN; 除以零 其他有限值导致有符号零。标志由确定 上述规则。
您应该做的是将intRate
转换为double
。
interestRate = (double)intRate / 100 / 12;