为什么当我 运行 this 时它显示 Nan?

Why does it show Nan when i run this?

这段代码是求解Java中的一个二次方程。它输出 puts 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

你得到这个结果是因为你没有正确使用 Math#sqrt

b * b - 4 * a * c必须为正数。


来自 Math#sqrt Javadoc

◦If the argument is NaN or less than zero, then the result is NaN.


加法(来自@PeterLawrey)

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

始终检查可能的域条件以使您的代码正常工作。

根据你的问题,我确定你已经给出了输入,其中 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");
    }

因为 a=1, b=2, c=10: Math.sqrt(b * b - 4 * a * c) 意味着 Math.sqrt(-38) Math.sqrt() 的行为是它返回 NAN 如果参数为负(在你的情况下)。