2013-04-16 54 views
0

好吧,我是一個完整的Java noob,我正在嘗試爲使用掃描儀輸入運行二次方程的類創建一個程序。到目前爲止,我得到了什麼是這樣的:帶掃描儀輸入的二次公式

import java.util.*; 

public class QuadraticFormulaSCN { 


public static void main(String[]args) { 
    System.out.println("insert value for a:"); 
    Scanner scan1 = new Scanner(System.in); 
    double a = scan1.nextDouble(); 
    System.out.println("insert value for b:"); 
    Scanner scan2 = new Scanner(System.in); 
    double b = scan2.nextDouble(); 
    System.out.println("insert value for C:"); 
    Scanner scan3 = new Scanner(System.in); 
    double c = scan3.nextDouble(); 

    double answer =((Math.sqrt(Math.pow(b,2)-(4*a*c))-b)/2); 
     double final2 =(-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/2; 
    System.out.println("The x values are:" + answer + final2); 
} 
} 

,但我得到一個奇怪的輸出,特別是NaNaN ......我該怎麼做才能解決這個問題?我究竟做錯了什麼?

+2

你應該只使用一個'掃描儀'。 – syb0rg

+0

此外,如果您(至少出於測試目的)避免單行代碼並將微積分分成若干變量,它將幫助您,以便於調試打印。無論如何,你確定你已經設置的方程至少有一個解決方案(和,恕我直言,你應該嘗試打印兩個解決方案,如果他們確實存在)。 – SJuan76

回答

2

NaN是計算無效時得到的結果。如除以0或取-1的平方根。

當我測試與a = 1b = 0c = -4答案你的代碼是2.02.0

的格式不正確和final2計算不被取。

否則代碼是正確的。

爲了提高你可以檢查判別式是否爲負數。

double d = b*b -4 * a * c; 
if (d < 0){ 
    System.out.println("Discriminant < 0, no real solutions"); 
    return; 
} 
double x1 = (-b -sqrt(d))/(2*a); 
double x2 = (-b +sqrt(d))/(2*a); 
System.out.format("The roots of your quadratic formula are %5.3f and %5.3f\n",x1,x2); 

或者,如果你喜歡從複雜的領域解決方案支持:

if (d < 0) { 
    System.out.println("Discriminant < 0, only imaginary solutions"); 
    double r = -b/(2 * a); 
    double i1 = -sqrt(-d)/(2/a); 
    double i2 = sqrt(-d)/(2/a); 
    System.out.format("The roots of your quadratic formula are (%5.3f + %5.3fi) and (%5.3f + %5.3fi)\n",r, i1, r, i2); 
    return; 
} 
1

你得到NaN,因爲你正試圖採取負數的平方根。在數學中,除非允許複數,否則不允許1 +/- 2i

當判別式(平方根中的東西)爲負值時,這可能發生在二次公式中,例如x^2 + 6*x + 100b^2 - 4ac = 36-400 = -364。取一個負數in Java leads to NaN的平方根。 (不是數字)

要測試NaN,請使用Double.isNaN並適當處理NaN

此外,您的計算是即使沒有被碰到NaN不正確:

$ java QuadraticFormulaSCN 
insert value for a: 
1 
insert value for b: 
5 
insert value for C: 
6 
The x values are:-2.0-2.0 

這應該輸出的2.0和3.0

0

您只能做計算的時候 判別等於或大於零

if(((Math.pow(b,2)-(4*a*c))>= 0){ /* Calculation here */ } 
else {/*error message or complex number calculus*/}; 
2

我有點晚回答,但我糾正了你的問題(descr在其他答案中加上ibed),修正了你的一個計算,並清理了你的代碼。

import java.util.*; 

public class Test { 

    public static void main(String[] args) 
    { 
     Scanner s = new Scanner(System.in); 
     System.out.println("Insert value for a: "); 
     double a = Double.parseDouble(s.nextLine()); 
     System.out.println("Insert value for b: "); 
     double b = Double.parseDouble(s.nextLine()); 
     System.out.println("Insert value for c: "); 
     double c = Double.parseDouble(s.nextLine()); 
     s.close(); 

     double answer1 = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c)))/(2 * a); 
     double answer2 = (-b - Math.sqrt(Math.pow(b, 2) - (4 * a * c)))/(2 * a); 

     if (Double.isNaN(answer1) || Double.isNaN(answer2)) 
     { 
      System.out.println("Answer contains imaginary numbers"); 
     } else System.out.println("The values are: " + answer1 + ", " + answer2); 
    } 
} 
0

有一件事我一直試圖做的就是把我所有的數學在適當的括號,以避免,一切都太容易,的操作失誤令。 NaN說「不是數字」。如果用戶輸入的數字無法產生結果,例如嘗試獲取負數的平方根,您也會收到該消息。另外,就像說明一樣,只需在掃描儀上使用a,b和c,就可以節省一些時間。

public class QuadraticFormula{ 

    public static void main(String[] args){ 
     java.util.Scanner input = new java.util.Scanner(System.in); 
     double a = input.nextDouble(); 
     double b = input.nextDouble(); 
     double c = input.nextDouble(); 

     double quadPos = (-b + Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a); 
     double quadNeg = (-b - Math.sqrt(Math.pow(b,2)-(4*a*c)))/(2*a); 

     System.out.println("-b - = " + quadNeg + "\n-b + = " + quadPos); 

     } 
    }