Java 带扫描输入的二次公式
好的,我是一个完整的JavaNoob,我正在尝试为类创建一个程序,该类使用扫描器输入运行一个二次方程。到目前为止,我得到的是:Java 带扫描输入的二次公式,java,input,java.util.scanner,output,quadratic,Java,Input,Java.util.scanner,Output,Quadratic,好的,我是一个完整的JavaNoob,我正在尝试为类创建一个程序,该类使用扫描器输入运行一个二次方程。到目前为止,我得到的是: import java.util.*; public class QuadraticFormulaSCN { public static void main(String[]args) { System.out.println("insert value for a:"); Scanner scan1 = new Scanner(System.in);
import java.util.*;
public class QuadraticFormulaSCN {
public static void main(String[]args) {
System.out.println("insert value for a:");
Scanner scan1 = new Scanner(System.in);
double a = scan1.nextDouble();
System.out.println("insert value for b:");
Scanner scan2 = new Scanner(System.in);
double b = scan2.nextDouble();
System.out.println("insert value for C:");
Scanner scan3 = new Scanner(System.in);
double c = scan3.nextDouble();
double answer =((Math.sqrt(Math.pow(b,2)-(4*a*c))-b)/2);
double final2 =(-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/2;
System.out.println("The x values are:" + answer + final2);
}
}
但我得到一个奇怪的输出,特别是
NaNaN
。。。我该怎么做才能解决这个问题?我做错了什么?NaN
是计算无效时得到的结果。例如除以0或取-1的平方根
当我用a=1
、b=0
和c=-4
测试代码时,答案是2.02.0
格式不正确,final2
的计算没有被否定
否则代码是正确的
为了改进,您可以检查判别式是否为负值
double d = b*b -4 * a * c;
if (d < 0){
System.out.println("Discriminant < 0, no real solutions" );
return;
}
double x1 = (-b -sqrt(d))/(2*a);
double x2 = (-b +sqrt(d))/(2*a);
System.out.format("The roots of your quadratic formula are %5.3f and %5.3f\n",x1,x2);
double d=b*b-4*a*c;
if(d<0){
System.out.println(“判别式<0,无实际解”);
返回;
}
双x1=(-b-sqrt(d))/(2*a);
双x2=(-b+sqrt(d))/(2*a);
System.out.format(“二次公式的根是%5.3f和%5.3f\n”,x1,x2);
或者,如果您更喜欢支持复杂领域的解决方案:
if (d < 0) {
System.out.println("Discriminant < 0, only imaginary solutions");
double r = -b / (2 * a);
double i1 = -sqrt(-d) / (2 / a);
double i2 = sqrt(-d) / (2 / a);
System.out.format("The roots of your quadratic formula are (%5.3f + %5.3fi) and (%5.3f + %5.3fi)\n",r, i1, r, i2);
return;
}
if(d<0){
System.out.println(“判别式<0,仅虚解”);
双r=-b/(2*a);
双i1=-sqrt(-d)/(2/a);
双i2=sqrt(-d)/(2/a);
System.out.format(“二次公式的根是(%5.3f+%5.3fi)和(%5.3f+%5.3fi)\n”,r,i1,r,i2);
返回;
}
NaN
是计算无效时得到的结果。例如除以0或取-1的平方根
当我用a=1
、b=0
和c=-4
测试代码时,答案是2.02.0
格式不正确,final2
的计算没有被否定
否则代码是正确的
为了改进,您可以检查判别式是否为负值
double d = b*b -4 * a * c;
if (d < 0){
System.out.println("Discriminant < 0, no real solutions" );
return;
}
double x1 = (-b -sqrt(d))/(2*a);
double x2 = (-b +sqrt(d))/(2*a);
System.out.format("The roots of your quadratic formula are %5.3f and %5.3f\n",x1,x2);
double d=b*b-4*a*c;
if(d<0){
System.out.println(“判别式<0,无实际解”);
返回;
}
双x1=(-b-sqrt(d))/(2*a);
双x2=(-b+sqrt(d))/(2*a);
System.out.format(“二次公式的根是%5.3f和%5.3f\n”,x1,x2);
或者,如果您更喜欢支持复杂领域的解决方案:
if (d < 0) {
System.out.println("Discriminant < 0, only imaginary solutions");
double r = -b / (2 * a);
double i1 = -sqrt(-d) / (2 / a);
double i2 = sqrt(-d) / (2 / a);
System.out.format("The roots of your quadratic formula are (%5.3f + %5.3fi) and (%5.3f + %5.3fi)\n",r, i1, r, i2);
return;
}
if(d<0){
System.out.println(“判别式<0,仅虚解”);
双r=-b/(2*a);
双i1=-sqrt(-d)/(2/a);
双i2=sqrt(-d)/(2/a);
System.out.format(“二次公式的根是(%5.3f+%5.3fi)和(%5.3f+%5.3fi)\n”,r,i1,r,i2);
返回;
}
您得到的是NaN
,因为您试图取负数的平方根。在数学中,这是不允许的,除非你允许复数,例如1+/-2i
在二次公式中,当判别式(平方根中的东西)为负时,这可能发生,例如x^2+6*x+100
:b^2-4ac
=36-400=-364。取负数的平方根。(不是数字)
要测试NaN
,请使用并适当处理NaN
此外,即使未遇到NaN
,您的计算也不正确:
$ java QuadraticFormulaSCN
insert value for a:
1
insert value for b:
5
insert value for C:
6
The x values are:-2.0-2.0
这应该输出2.0和3.0,因为您试图取一个负数的平方根,所以得到的是
NaN
。在数学中,这是不允许的,除非你允许复数,例如1+/-2i
在二次公式中,当判别式(平方根中的东西)为负时,这可能发生,例如x^2+6*x+100
:b^2-4ac
=36-400=-364。取负数的平方根。(不是数字)
要测试NaN
,请使用并适当处理NaN
此外,即使未遇到NaN
,您的计算也不正确:
$ java QuadraticFormulaSCN
insert value for a:
1
insert value for b:
5
insert value for C:
6
The x values are:-2.0-2.0
这应该输出2.0和3.0您应该只在 判别式等于或大于零
if(((Math.pow(b,2)-(4*a*c))>= 0){ /* Calculation here */ }
else {/*error message or complex number calculus*/};
您应该仅在以下情况下进行计算: 判别式等于或大于零
if(((Math.pow(b,2)-(4*a*c))>= 0){ /* Calculation here */ }
else {/*error message or complex number calculus*/};
我回答有点晚,但我纠正了您的问题(在其他答案中描述),修复了您的一个计算,并清理了您的代码
import java.util.*;
public class Test {
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.println("Insert value for a: ");
double a = Double.parseDouble(s.nextLine());
System.out.println("Insert value for b: ");
double b = Double.parseDouble(s.nextLine());
System.out.println("Insert value for c: ");
double c = Double.parseDouble(s.nextLine());
s.close();
double answer1 = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
double answer2 = (-b - Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
if (Double.isNaN(answer1) || Double.isNaN(answer2))
{
System.out.println("Answer contains imaginary numbers");
} else System.out.println("The values are: " + answer1 + ", " + answer2);
}
}
我回答有点晚,但我纠正了您的问题(在其他答案中描述),修复了您的一个计算,并清理了您的代码
import java.util.*;
public class Test {
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.println("Insert value for a: ");
double a = Double.parseDouble(s.nextLine());
System.out.println("Insert value for b: ");
double b = Double.parseDouble(s.nextLine());
System.out.println("Insert value for c: ");
double c = Double.parseDouble(s.nextLine());
s.close();
double answer1 = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
double answer2 = (-b - Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
if (Double.isNaN(answer1) || Double.isNaN(answer2))
{
System.out.println("Answer contains imaginary numbers");
} else System.out.println("The values are: " + answer1 + ", " + answer2);
}
}
我经常尝试做的一件事是把我所有的数学放在适当的括号里,以避免一个非常简单的运算顺序错误。NaN表示“不是一个数字”。如果用户输入的数字不能产生结果,例如a试图获得负数的平方根,您也会收到该消息。另外,请注意,您只需在扫描仪上使用a、b和c即可节省时间
public class QuadraticFormula{
public static void main(String[] args){
java.util.Scanner input = new java.util.Scanner(System.in);
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
double quadPos = (-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a);
double quadNeg = (-b - Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a);
System.out.println("-b - = " + quadNeg + "\n-b + = " + quadPos);
}
}
我经常尝试做的一件事是把我所有的数学放在适当的括号里,以避免一个非常简单的运算顺序错误。NaN表示“不是一个数字”。如果用户输入的数字不能产生结果,例如a试图获得负数的平方根,您也会收到该消息。另外,请注意,您只需在扫描仪上使用a、b和c即可节省时间
public class QuadraticFormula{
public static void main(String[] args){
java.util.Scanner input = new java.util.Scanner(System.in);
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
double quadPos = (-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a);
double quadNeg = (-b - Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a);
System.out.println("-b - = " + quadNeg + "\n-b + = " + quadPos);
}
}
您应该只使用一个
扫描器
。此外,如果您(至少出于测试目的)避免使用一行代码,并将微积分分离到多个变量中,以便于调试打印,这将对您有所帮助。不管怎样,你确定你设置的方程至少有一个解(而且,依我看,如果两个解都存在的话,你应该试着打印出来)。你应该只使用一个扫描器。另外,如果你(至少出于测试目的)避免使用一行代码并将微积分分成几个变量,这将对你有所帮助,为便于调试打印。不管怎样,你确定你设置的方程至少有一个解吗(