0

我创建了一个贷款支付计算器。每当我输入任何输入时,输出都会显示为 NaN。关于我可以改变的任何想法。第一段代码是main方法。第二个是另一个类。

主要方法

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);
        }

    }

}

班级

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;
    }

}
4

3 回答 3

2

我的第一个预感是在Math.pow中引入了 NaN,因为有大量条件将使其返回 NaN - 查看实际输入值是什么。

而且,现在关于实际值 -因为正在进行整数除法interestRate,所以将是错误的(并且可能是 0) 。尝试:

 interestRate = (double)intRate / 100 / 12;
于 2013-11-01T02:31:45.440 回答
1

当你锻炼时,你被零除monthlyPayment

因为您在计算 时进行整数除法interestRate,所以您以零结束。所以在下一行,你实际上在做Math.pow(1, -loanLength * 12)的总是会给你 1。你从 1 中减去结果并除以它。因此除以零。

您需要该intRate参数是 a double,而不是 a int,以便在计算 时不会得到整数除法interestRate

您可以使用演员表来执行此操作(根据当前此处的其他两个答案),但我认为您最好double从一开始就拥有它 - 当您第一次声明intRatemain,当您从扫描仪中获取它时,以及当你将它传递给monthlyPayment.

于 2013-11-01T02:31:53.567 回答
1

该表达式interestRate = intRate / 100 / 12正在执行整数除法。这些股息/除数都没有转换为十进制值,所以你得到 0。

这使得这个表达式很有趣:

 Math.pow((1 + interestRate) , - loanLength * 12 )

结果是 1(因为 1 的任何幂总是 1)。你减去 1 得到 0。

现在,当您在 IEEE 754 浮点值中除以零时,会发生一些有趣NaN的事情 - 您得到.

浮点除法的结果由 IEEE 754 算术规则确定:

  • 如果任一操作数为 NaN,则结果为 NaN。

  • 如果结果不是 NaN,则如果两个操作数的符号相同,则结果的符号为正,如果两个操作数的符号不同,则结果的符号为负。

  • 无穷大除以无穷大得到 NaN。

  • 一个无穷大除以一个有限值导致有符号无穷大。符号由上述规则确定。

  • 有限值除以无穷大导致有符号零。符号由上述规则确定。

  • 零除以零导致 NaN;零除以任何其他有限值会导致有符号零。符号由上述规则确定。

你应该做的是转换intRate为 a double

interestRate = (double)intRate / 100 / 12;
于 2013-11-01T02:34:29.947 回答