Java 求二次方程的精确根

Java 求二次方程的精确根,java,performance,Java,Performance,这是迄今为止我所掌握的代码。该项目的目标是让用户为a,b,c为ax^2+bx+c方程输入任何整数。由于某些原因,我没有得到输入到程序中的任何数字的正确根。有人能指出我的错误吗 import java.util.*; public class Quad_Form { public static void main(String[] args){ Scanner sc = new Scanner(System.in); double a = 0; double b

这是迄今为止我所掌握的代码。该项目的目标是让用户为
a
b
c
ax^2+bx+c
方程输入任何整数。由于某些原因,我没有得到输入到程序中的任何数字的正确根。有人能指出我的错误吗

import java.util.*;


public class Quad_Form {

public static void main(String[] args){

    Scanner sc = new Scanner(System.in);

    double a = 0;
    double b = 0;
    double c = 0;
    double discrim = 0;
    double d = 0;

    System.out.println("Enter value for 'a'");
    String str_a = sc.nextLine();
    a = Integer.parseInt(str_a);

    System.out.println("Enter value for 'b'");
    String str_b = sc.nextLine();
    b = Integer.parseInt(str_b);

    System.out.println("Enter value for 'c'");
    String str_c = sc.nextLine();
    c = Integer.parseInt(str_c);

    double x1 = 0, x2 = 0;
    discrim = (Math.pow(b, 2.0)) - (4 * a * c);
    d = Math.sqrt(discrim);

    if(discrim == 0){
        x1 = (-b + d) / (2* a);
        String root_1 = Double.toString(x1);
        System.out.println("There is one root at: " + root_1);
        }

    else {
        if (discrim > 0)
        x1 = (-b + d) / (2 * a);
        x2 = (-b - d) / (2 * a);
        String root_1 = Double.toString(x1);
        String root_2 = Double.toString(x2);
        System.out.println("There are two real roots at:"  + root_1 + "and"  + root_2);
        }

    if (discrim < 0){

        x1 = (-b + d) / (2 * a);
        x2 = (-b - d) / (2 * a);
        String root_1 = Double.toString(x1);
        String root_2 = Double.toString(x2);
        System.out.println("There are two imaginary roots at:" + root_1 + "and" + root_2);
        }
    }


}
import java.util.*;
公共类四联表{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
双a=0;
双b=0;
双c=0;
双discrim=0;
双d=0;
System.out.println(“输入'a'的值”);
字符串str_a=sc.nextLine();
a=整数.parseInt(str_a);
System.out.println(“输入'b'的值”);
字符串str_b=sc.nextLine();
b=整数.parseInt(str_b);
System.out.println(“输入'c'的值”);
字符串str_c=sc.nextLine();
c=整数.parseInt(str_c);
双x1=0,x2=0;
discrim=(数学功率(b,2.0))-(4*a*c);
d=数学sqrt(discrim);
如果(discrim==0){
x1=(-b+d)/(2*a);
字符串根_1=Double.toString(x1);
System.out.println(“有一个根在:“+root_1”);
}
否则{
如果(discrim>0)
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
字符串根_1=Double.toString(x1);
字符串根_2=Double.toString(x2);
System.out.println(“有两个实根:“+root_1+”和“+root_2”);
}
if(discrim<0){
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
字符串根_1=Double.toString(x1);
字符串根_2=Double.toString(x2);
System.out.println(“有两个假想根:“+root_1+”和“+root_2”);
}
}
}

a
b
c
d
是双精度的,您将它们解析为整数。所以这可能是一个问题

使用

另一个问题是不能求负数的平方根。这将导致
NaN
。对于该用途,请遵循以下步骤,但您应该正确地处理它以获得准确的结果

  Math.sqrt(Math.abs());
此外,您应该使用以下公式获得根

摘自维基百科


a
b
c
d
是双精度的,您将它们解析为整数。所以这可能是一个问题

使用

另一个问题是不能求负数的平方根。这将导致
NaN
。对于该用途,请遵循以下步骤,但您应该正确地处理它以获得准确的结果

  Math.sqrt(Math.abs());
此外,您应该使用以下公式获得根

摘自维基百科


@Smit在其中一个问题上是正确的,但还有第二个问题


Math.sqrt(discrim)
discrim
为负值时不起作用。你应该改学
Math.sqrt(Math.abs(discrim))

@Smit在其中一个问题上是正确的,但还有第二个问题


Math.sqrt(discrim)
discrim
为负值时不起作用。您应该改为使用
Math.sqrt(Math.abs(discrim))

哈哈,我在更改代码时设法查看了一个小错误。但我仍然没有得到正确的答案。如果我为a输入1,为b输入5,为c输入6;我应该得到根-2和-3。相反,我得到了0.5和0。5@KGidorahh正如另一个答案所说,你们不能求负数的平方根。你必须处理好这种情况。@Kgidorah我更新了答案。我希望这能解决你的痛苦。哈哈,我在修改代码时发现了一个小错误。但我仍然没有得到正确的答案。如果我为a输入1,为b输入5,为c输入6;我应该得到根-2和-3。相反,我得到了0.5和0。5@KGidorahh正如另一个答案所说,你们不能求负数的平方根。你必须处理好这种情况。@Kgidorah我更新了答案。我希望这能解决你的痛苦。你为什么要用
pow()
函数来计算正方形<代码>(Math.pow(b,2.0))-(4*a*c)
为什么不简单地将其自身相乘
b*b-(4*a*c)
这不太可能对
b
的负值造成问题,也可以避免
pow()
导致精度降低。为什么要使用
pow()
函数来计算平方<代码>(Math.pow(b,2.0))-(4*a*c)
为什么不简单地将其自身相乘
b*b-(4*a*c)
这不太可能导致
b
的负值出现问题,也可以避免
pow()造成的精度降低。