为什么在我运行时会显示Nan?

时间:2016-03-19 15:42:28

标签: java math quadratic

此代码用于解决Java中的二次方程。它输出放置Nan。 有什么不对,怎么解决这个问题?

我尝试了a=1, b=2, c=10

import java.util.*;

class equation {
  public static void main(String args[]) {
    int a, b, c;
    String input;
    Scanner key = new Scanner(System.in);

    System.out.println("Enter a value for a: ");
    a = key.nextInt();


    System.out.println("Enter a value for b: ");
    b = key.nextInt();


    System.out.println("Enter a value for c: ");
    c = key.nextInt();


    //finding roots
    double temp = Math.sqrt(b * b - 4 * a * c);

    double root1 = (-b + temp) / (2 * a);
    double root2 = (b + temp) / (2 * a);

    System.out.println("Answers are " + root1 + " or " + root2 + " .");
  }
}

enter image description here

3 个答案:

答案 0 :(得分:3)

您得到此结果是因为您未正确使用Math#sqrt

b * b - 4 * a * c必须是正面的。

来自Math#sqrt Javadoc

  

◦如果参数为NaN或小于零,则结果为NaN。

加法(来自@PeterLawrey)

因此,如果您输入a=1b=2c=10,则b * b - 4 * a * c4 - 40-36,平方根为{{1}这是一个虚数,double不支持,因此6i返回Math#sqrt

答案 1 :(得分:0)

始终检查可能的域条件,以使代码生效。

根据您的问题,我确信您已将b*b-4*a*c<0输入为何其返回NAN

这是完整的代码

    Scanner z = new Scanner(System.in):
    double first = z.nextInt();
    double second = z.nextInt();
    double third = z.nextInt();
    double d = (second * second - 4 * first * third);
    double re = -second / (2 * first);
     if (d >= 0) {  // i.e. "if roots are real"
        System.out.println(Math.sqrt(d) / (2 * first) + re);
        System.out.println(-Math.sqrt(d) / (2 * first) + re);
    } else {
      System.out.println(re + " + " + (Math.sqrt(-d) / (2 * first)) + "i");
      System.out.println(re + " - " + (Math.sqrt(-d) / (2 * first)) + "i");
    }

答案 2 :(得分:0)

对于a=1, b=2, c=10: Math.sqrt(b * b - 4 * a * c)表示Math.sqrt(-38) Math.sqrt()的行为是,如果参数为负数(在您的情况下),则会重新调整NAN