2017-04-25 97 views
-1

自從我上次詢問這裏的任何東西以來已經有一段時間了! 我在做一個Android應用程序,因此,運行時,該代碼:Java計算返回無窮大

Button calc = (Button) findViewById(R.id.btnCalculate); 
    calc.setOnClickListener(new View.OnClickListener() 

    { 
     public void onClick(View v) { 

      EditText number1 = (EditText) findViewById(R.id.dnp); 
      EditText number2 = (EditText) findViewById(R.id.ponte); 
      EditText number3 = (EditText) findViewById(R.id.aro); 
      EditText number4 = (EditText) findViewById(R.id.ed); 
      EditText number5 = (EditText) findViewById(R.id.esf); 
      EditText number6 = (EditText) findViewById(R.id.curvint); 
      EditText number7 = (EditText) findViewById(R.id.curvb); 
      EditText number8 = (EditText) findViewById(R.id.ind); 
      EditText number9 = (EditText) findViewById(R.id.espmin); 
      TextView display = (TextView) findViewById(R.id.display); 

      double dnp = Double.parseDouble(number1.getText().toString()); 
      double ponte = Double.parseDouble(number2.getText().toString()); 
      double aro = Double.parseDouble(number3.getText().toString()); 
      double ed = Double.parseDouble(number4.getText().toString()); 
      double esf = Double.parseDouble(number5.getText().toString()); 
      double curvint = Double.parseDouble(number6.getText().toString()); 
      double curvb = Double.parseDouble(number7.getText().toString()); 
      double ind = Double.parseDouble(number8.getText().toString()); 
      double espmin = Double.parseDouble(number9.getText().toString()); 

      double R1; 
      double R2; 
      double DT; //Decentração total 
      double DM; //Decentração monocular 
      double diametro; 
      double S1; 
      double S2; 
      double espessurafinal; 

      if (esf < 0) 
      { 

       R1 = (ind - 1/curvb) * 1000; 
       R2 = (ind - 1/curvint) * 1000; 
       DT = (aro+ponte)-dnp; 
       DM = (DT/2); 
       diametro = (ed + 2 * DM)/2; 
       S1 = R1 - (Math.sqrt(Math.exp(R1)-Math.exp(diametro))); 
       S2 = R2 - (Math.sqrt(Math.exp(R2)-Math.exp(diametro))); 
       espessurafinal = (S1 - S2) + espmin; 
       display.setText(espessurafinal + "" + "\nMilímetros"); 
      } 

      else { 

       R1 = (ind - 1/curvb) * 1000; 
       R2 = (ind - 1/curvint) * 1000; 
       DT = (aro+ponte)-dnp; 
       DM = (DT/2); 
       diametro = (ed + 2 * DM)/2; 
       S1 = R1 - (Math.sqrt(Math.exp(R1)-Math.exp(diametro))); 
       S2 = R2 - (Math.sqrt(Math.exp(R2)-Math.exp(diametro))); 
       espessurafinal = espmin - (S1 + S2); 
       display.setText(espessurafinal + "\nMilímetros"); 
      } 
     } 
    }); 

我可能失去了一些東西很瑣碎這裏,我的編碼技能 非常有限有這個問題,但是這個代碼片段當我按下計算按鈕時返回「Infinity」。現在,我之前收到NaN,並設法擺脫它,但只是看到它變得無限!我研究發現,這是由於 某些數字除以0,但我沒有看到... (哦,是的,我確定所有輸入的數字都不是0)

可能只是我的編碼,把事情放在他們錯誤的地方? (是的,我知道我可以通過使用函數和所有這些來使代碼變得更好......但我正在學習人,對我很溫柔)。

或者,我的數學是非常錯誤的,並返回極高的東西?

在此先感謝大家!

+0

你的輸入是怎樣的? –

+0

似乎一個輸入字段可能會接受一個字符串,然後當您使用解析雙嘗試解析整個字符串, – Remario

+0

我在xml中的輸入都是這樣的,當然有不同的id:然後,@Remario,我正在運行instanceof現在......只有在您可以對輸入值執行任何算術運算後,纔會立即返回 – Luis

回答

1

看來,一些輸入實際上並不是一個數字,或者是一些與某些隨機字符串混合的數字。通過檢查輸入是否爲Double的instanceof對編輯文本值進行驗證檢查。 input instanceof Double

if(input instanceof Double) { 
    System.out.println("input is a Double"); 
    } 

之前,您可以檢查的情況下,確保輸入的是乾淨的,用在編輯文本只numerals.Run一個java正則表達式^[0-9]*$,如果真那麼只有數字被輸入,然後使用Double.valueOf(val)Double.parse()唯一的區別是後者返回Double類型的對象,而另一個只返回原始類型。

+0

。 – Remario

+0

雖然不是一個很好的練習,但它將所有的計算都包含在try catch塊中。 catch塊爲所有異常捕獲異常(超類)。這樣我們可以捕獲所有異常(如果有的話)。 – Remario

+0

但是,你的代碼段總是不會返回字符串? – Luis