我尝试并成功构建了二次方程求解器。
public class Solver {
public static void main (String[] args) {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = Integer.parseInt(args[2]);
double positive = (-b + Math.sqrt(b*b-4*a*c))/2*a;
double negative = (-b - Math.sqrt(b*b-4*a*c))/2*a;
System.out.println("First answer is " + positive);
System.out.println("Second answer is " + negative);
}
}
有时我在输出中得到NaN。 我做错了什么?
答案 0 :(得分:1)
NaN
- 不是数字 - 是一个值,表示无效数学运算的结果。使用实数,您无法计算负数的平方根 - 因此返回NaN
。
您的解决方案的另一个问题是/2*a
片段。除法和乘法具有相同的优先级,因此括号是必要的。此外,如果a
等于零,Java将抛出java.lang.ArithmeticException: / by zero
- 您还需要检查它。
一种可能的解决方案是:
if (a == 0) {
System.out.println("Not a quadratic equation.");
return;
}
double discriminant = b*b - 4*a*c;
if (discriminant < 0) {
System.out.println("Equation has no ansewer.");
} else {
double positive = (-b + Math.sqrt(discriminant)) / (2*a);
double negative = (-b - Math.sqrt(discriminant)) / (2*a);
System.out.println("First answer is " + positive);
System.out.println("Second answer is " + negative);
}
答案 1 :(得分:0)
NaN代表非数字。您输入的输入导致数学上未定义的操作。所以,如果第一个数字&#34; a&#34;你得到的是零,如果b * b大于4 * a * c,你也会得到那条信息,第一种情况是除零,第二种情况是计算负数的根。