为什么我一直把NaN作为输出?

时间:2013-11-01 02:27:43

标签: java

我创建了一个贷款支付计算器。每当我输入任何输入时,输出都会显示为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;
    }

}

3 个答案:

答案 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;