为什么当我 运行 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 + " .");
}
}
你得到这个结果是因为你没有正确使用 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=1
、b=2
、c=10
,则 b * b - 4 * a * c
为 4 - 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
如果参数为负(在你的情况下)。
这段代码是求解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 + " .");
}
}
你得到这个结果是因为你没有正确使用 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=1
、b=2
、c=10
,则 b * b - 4 * a * c
为 4 - 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
如果参数为负(在你的情况下)。