2013-12-24 36 views
0

我不確定我在做什麼錯在我的代碼中,但我無法讓它正常運行......測試者不斷返回NaN而不是預期的結果。本練習的目標是打印二次方程的所有實數解。 solution1應返回較小的解決方案,而solution2應返回較小的解決方案。這是我的班。二次方程式程序 - 得到NaN錯誤

public class QuadraticEquation 
    { 
    private int a; 
    private int b; 
    private int c; 
    private boolean hasSolutions; 
    private double discriminant = (b * b) - (4 * a * c); 
    private double solution1; 
    private double solution2; 
    /** 
* Constructs a quadratic equation 
* @param a coefficient a 
* @param b coefficient b 
* @param c coefficient c 
*/ 

    public QuadraticEquation(int a, int b, int c) 
    { 
     a = a; 
     b = b; 
     c = c; 
    } 
    /** 
* Checks if there is a solution 
* @return true if there is a real solution 
*/ 

    public boolean hasSolutions() 
    { 
     if(discriminant < 0) 
      hasSolutions = false; 
     else 
      hasSolutions = true; 
     return hasSolutions; 
    } 
    /** 
    * Returns first solution 
    * @return first solution 
    */ 

    public double getSolution1() 
    { 
     if(hasSolutions) 
     { 
      if((-b + Math.sqrt(discriminant)/(2 * a)) < (-b - Math.sqrt(discriminant)/(2 * a))) 
       solution1 = (-b + Math.sqrt(discriminant)/(2 * a)); 
      else 
       solution1 = (-b - Math.sqrt(discriminant)/(2 * a)); 
     } 
      return solution1; 
    } 
    /** 
    * Returns second solution 
    * @return second solution 
    */ 

    public double getSolution2() 
    { 
     if(hasSolutions) 
     { 
      if((-b + Math.sqrt(discriminant)/(2 * a)) > (-b - Math.sqrt(discriminant)/(2 * a))) 
       solution2 = (-b + Math.sqrt(discriminant)/(2 * a)); 
      else 
       solution2 = (-b - Math.sqrt(discriminant)/(2 * a)); 
     } 
      return solution2; 
    } 

    } 

這裏是我的測試:

public class QuadraticEquationTester 
    { 
    public static void main(String[] args) 
     { 
      QuadraticEquation equation = new QuadraticEquation(2, 2, -4); 
      System.out.println(equation.hasSolutions()); 
      System.out.println("Expected: true"); 
      System.out.println(equation.getSolution1()); 
      System.out.println("Expected: -2"); 
      System.out.println(equation.getSolution2()); 
      System.out.println("Expected: 1"); 

      QuadraticEquation equation2 = new QuadraticEquation(2, 2, 4); 
      System.out.println("\n" + equation2.hasSolutions()); 
      System.out.println("Expected: false"); 
      System.out.println(equation2.getSolution1()); 
      System.out.println("Expected: 0"); 
      System.out.println(equation2.getSolution2()); 
      System.out.println("Expected: 0"); 
     } 
    } 

太謝謝你了! :)

+0

它爲'hasSolutions()'輸出'true'嗎? –

+0

是的,但它應該返回false。 :( – user3001948

回答

7
  1. 您正在計算正在其中計算與a, b, and c默認值的級別上下文的對象初始化部discriminant。在初始化之前不要計算a,bc

  2. 由於a, b, c是參數字段,因此您在構造方法中隱藏了變量。使用this

    public QuadraticEquation(int a, int b, int c) 
    { 
        this.a = a; 
        this.b = b; 
        this.c = c; 
    } 
    
  3. NaN結果浮點運算與像零零deviding的操作。因此,如果仍然發生上述問題,請找出這種情況。

+0

謝謝!它的工作原理,除非它沒有返回這兩個解決方案;它只返回較小的解決方案,並且它對於第二個解決方案返回true – user3001948

+0

像這個答案表明,計算構造函數中的'discriminant',第二個不應該返回真實。 – justderb

+0

它現在有效,謝謝:) – user3001948