此代码用于解决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 + " .");
}
}
答案 0 :(得分:3)
您得到此结果是因为您未正确使用Math#sqrt
。
b * b - 4 * a * c
必须是正面的。
Math#sqrt
Javadoc ◦如果参数为NaN或小于零,则结果为NaN。
因此,如果您输入a=1
,b=2
,c=10
,则b * b - 4 * a * c
为4 - 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
。