Java 二次方程误差

Java 二次方程误差,java,Java,不完全确定如何使用这个网站,所以如果问题太模糊,我道歉 我应该用二次方程来求根,但每当我输入a,b和c的变量时,它都会返回一个错误的答案。我想知道我的代码有什么问题 import java.util.Scanner; import static java.lang.System.*; import static java.lang.Math.*; public class Quadratic { private int a, b, c; private double rootOne;

不完全确定如何使用这个网站,所以如果问题太模糊,我道歉

我应该用二次方程来求根,但每当我输入a,b和c的变量时,它都会返回一个错误的答案。我想知道我的代码有什么问题

import java.util.Scanner; 
import static java.lang.System.*;
import static java.lang.Math.*;

public class Quadratic
{
 private int a, b, c;
 private double rootOne;
 private double rootTwo;

 public Quadratic()
 {
   setEquation(0,0,0);
   rootOne=0;
   rootTwo=0;
 }

 public Quadratic(int quadA, int quadB, int quadC)
 {
   setEquation(quadA, quadB, quadC);
   rootOne=0;
   rootTwo=0;
 }

 public void setEquation(int quadA, int quadB, int quadC)
 {
   a = quadA;
   b = quadB;
   c = quadC;
  }

 public void calcRoots( )
 {
   rootOne = (-b + (Math.sqrt((Math.pow(b,2)) - ((4 * a * c))))/(2*a));
   rootTwo = (-b - (Math.sqrt((Math.pow(b,2)) - ((4 * a * c))))/(2*a));
 }

 public void print( )
 {
   System.out.println("rootone :: " +rootOne);
   System.out.println("roottwo :: " +rootTwo);
 }
}

括号放错位置:

(-b + (Math.sqrt((Math.pow(b,2)) - ((4 * a * c))))/(2*a))
删除多余的括号后,代码将执行以下操作:

-b + Math.sqrt(Math.pow(b,2) - 4 * a * c) / (2 * a)
所以
-b
没有被
2a
除,您可能需要:

(-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a)
此外,正如马诺斯所提到的,
int
不是该类型的最佳选择

在这里,通过碎片接近可能有助于理解和性能:

double t1 = Math.sqrt(Math.pow(b, 2) - 4 * a * c);
double t2 = 2 * a;
rootOne = (-b + t1) / t2;
rootTwo = (-b - t1) / t2;

编程中的一种常见风格是避免代码多次执行相同的操作,尤其是幂和平方根之类的操作。

括号放错了位置:

(-b + (Math.sqrt((Math.pow(b,2)) - ((4 * a * c))))/(2*a))
删除多余的括号后,代码将执行以下操作:

-b + Math.sqrt(Math.pow(b,2) - 4 * a * c) / (2 * a)
所以
-b
没有被
2a
除,您可能需要:

(-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a)
此外,正如马诺斯所提到的,
int
不是该类型的最佳选择

在这里,通过碎片接近可能有助于理解和性能:

double t1 = Math.sqrt(Math.pow(b, 2) - 4 * a * c);
double t2 = 2 * a;
rootOne = (-b + t1) / t2;
rootTwo = (-b - t1) / t2;

编程中的一种常见风格是避免让代码多次执行相同的操作,特别是幂和平方根之类的操作。

为什么a、b、c都是整数?你把括号混在一起了。您的公式是
-b±(sqrt(delta)/2a)
,而不是
(-b±sqrt(delta))/2a
。通过拆分计算使代码更容易。首先计算
double delta=Math.pow(b,2)-4*a*c然后在剩下的计算中使用它
rootOne=(-b+Math.sqrt(delta))/(2*a)
rootTwo=(-b-Math.sqrt(delta))/(2*a)为什么a,b,c是整数?你用了混合括号。您的公式是
-b±(sqrt(delta)/2a)
,而不是
(-b±sqrt(delta))/2a
。通过拆分计算使代码更容易。首先计算
double delta=Math.pow(b,2)-4*a*c然后在剩下的计算中使用它
rootOne=(-b+Math.sqrt(delta))/(2*a)
rootTwo=(-b-Math.sqrt(delta))/(2*a)很好的答案。我想补充一点,在这些情况下,使用一个类来处理复杂值是值得的,因为有一种可能性(Math.pow(b,2)-4*a*c)<0,其中没有真正的解,但有复杂的解。这是一些高质量的答案!伊敏是荣,但没有错,他的回答是如此正确!道具。OP,我希望你的问题已经解决了。为什么要用数学。pow(b,2)什么时候b*b就可以了?因为带b*b的代码不是很清楚,特别是对于初学者。答案不错。我想补充一点,在这些情况下,使用一个类来处理复杂值是值得的,因为有一种可能性(Math.pow(b,2)-4*a*c)<0,其中没有真正的解,但有复杂的解。这是一些高质量的答案!伊敏是荣,但没有错,他的回答是如此正确!道具。我希望你的问题已经解决了。为什么要用Math.pow(b,2)当b*b就可以了?因为带b*b的代码不是很清楚,特别是对于初学者。