二次方程Java类

二次方程Java类,java,class,quadratic,Java,Class,Quadratic,我在学校的爪哇工作,到目前为止,我在课堂和作业问题上遇到了一些麻烦。对于二次方程类,我有以下标准: 到目前为止,我已经: private static double coefA; private static double coefB; private static double coefC; public static void main(String[] args) { Scanner input = new Scanner(System.in); System.ou

我在学校的爪哇工作,到目前为止,我在课堂和作业问题上遇到了一些麻烦。对于二次方程类,我有以下标准:

到目前为止,我已经:

private static double coefA;
private static double coefB;
private static double coefC;


public static void main(String[] args) 
{
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter the a, b and c for a Quadratic: ");
    coefA = input.nextDouble();
    coefB = input.nextDouble();
    coefC = input.nextDouble();

    double discriminant = getDiscriminant();

    if (discriminant < 0)
    {
        System.out.println("There are no real roots.");

    }
    else if (discriminant == 0)
    {
        System.out.println("The one root is: "+getRoot1());
    }
    else
    {
        System.out.println("The first root is: "+getRoot1());
        System.out.println("The second root is: "+getRoot2());
    }

}
//Construct
public QuadraticEquation(double a, double b, double c)
{
    coefA = a;
    coefB = b;
    coefC = c;
}

private static double getDiscriminant()
{
    double discriminant = (coefB * coefB) - (4 * coefA * coefC);
    return discriminant;
}
static double getRoot1()
{
    double root1 = (-coefB + Math.sqrt(getDiscriminant()))/ 2 * coefA;
    return root1;

}
static double getRoot2()
{
    double root2 = (-coefB - Math.sqrt(getDiscriminant()))/ 2 * coefA;
    return root2;

}
}
私有静态双coefA;
私有静态双coefB;
专用静态双coefC;
公共静态void main(字符串[]args)
{
扫描仪输入=新扫描仪(System.in);
System.out.println(“请输入a、b和c表示二次:”);
coefA=input.nextDouble();
coefB=input.nextDouble();
coefC=input.nextDouble();
双重鉴别器=getDiscriminant();
if(判别式<0)
{
System.out.println(“没有真正的根”);
}
else if(判别式==0)
{
println(“一个根是:“+getRoot1()”);
}
其他的
{
println(“第一个根是:“+getRoot1()”);
println(“第二个根是:“+getRoot2()”);
}
}
//构造
公共平方方程(双a、双b、双c)
{
coefA=a;
coefB=b;
coefC=c;
}
私有静态双getDiscriminant()
{
双判别式=(coefB*coefB)-(4*coefA*coefC);
返回判别式;
}
静态双getRoot1()
{
double root1=(-coefB+Math.sqrt(getDiscriminant())/2*coefA;
返回根1;
}
静态双getRoot2()
{
double root2=(-coefB-Math.sqrt(getDiscriminant())/2*coefA;
返回根2;
}
}

这个等式不起作用,我甚至认为我不符合标准,但我不完全理解这本书的要求。有人能帮忙吗?

你的数学方程的实现是正确的,但你必须把它放在括号里。例如,

double root1 = (-coefB + Math.sqrt(getDiscriminant()))/ 2 * coefA;
double root1 = (-coefB + Math.sqrt(getDiscriminant()))/ (2 * coefA);
这里的
(-coefB+Math.sqrt(getDiscriminant())
方程是除以
2
。然后用
coefA
进行乘法。小心点。用这个例子改变你的逻辑

double root1 = (-coefB + Math.sqrt(getDiscriminant()))/ (2 * coefA);
因此,应用到其他字段以获得正确的结果

你的两种方法应该改变

static double getRoot1()
{
    double root1 = (-coefB + Math.sqrt(getDiscriminant()))/ (2 * coefA);
    return root1;

}
static double getRoot2()
{
    double root2 = (-coefB - Math.sqrt(getDiscriminant()))/ (2 * coefA);
    return root2;

}
更详细地说,运算符优先级表

Operators                                       Precedence              Associativity
postfix increment and decrement                 ++ --                   left to right
prefix increment and decrement, and unary       ++ -- + - ~ !           right to left
multiplicative                                  * / %                   left to right
additive                                        + -                     left to right

对于二次方程类来说,这不是一个好的设计。这三个变量(coefA、coefB、coefC)应该是实例变量,而不是静态变量。您应该有一个将这三个值作为输入的构造函数。构造函数调用getDiscriminant()并计算两个可能的答案,并使用getter检索它们,效率更高。

将分母更改为(2*coef)。根据特定的系数,'==0'部分可能工作,也可能不工作。比较双精度的正确方法是使用不等式(<或>)。为了测试一个double是否等于某个数字,我们实际上测试它是否非常接近该数字:Math.abs(x-targetNumber)int getRootCount()
。在没有括号的情况下,乘法和除法从左到右执行,因为运算符具有相同的优先级。这就是括号后面的原因,虽然答案中没有详细说明。是的,我试着像你说的那样解释。但也许我的解释一点也不清楚,但总的来说,我想我会通过扫描器要求构造函数中的a、b和c,如果是这样,我如何实现它而不必使其保持静态?