获得二次方程的准确根

时间:2013-03-15 17:29:30

标签: java performance

这是我到目前为止的代码。该项目的目标是让用户为a等式输入bcax^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);
        }
    }


}

2 个答案:

答案 0 :(得分:2)

@Smit是关于其中一个问题的,但也有第二个问题。

Math.sqrt(discrim)为否定时,

discrim将无效。您应该改为Math.sqrt(Math.abs(discrim))

答案 1 :(得分:1)

abcd是双倍的,您将它们解析为整数。所以这可能是一个问题。

使用

 Double.parseDouble();

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

  Math.sqrt(Math.abs());

此外,你应该使用以下公式来获得根

the roots are given by the quadratic formula[

取自维基百科Quadratic equation

Class Double

Class Math