2017-04-25 3 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

これは、入力フィールドが文字列を受け入れる可能性があると思われる場合、解析doubleを使用すると、文字列全体の解析を試みる – Remario

+0

xmlの入力は、すべてこのようになります。もちろん、異なるidsがあります。そして、@Remario、私はinstanceofを実行しています...すぐに – Luis

答えて

1

入力の一部が実際には数字ではないか、またはランダムな文字列と混ざっているようです。入力がinstanceof Doubleであるかどうかをチェックして、編集テキスト値の検証チェックを行います。 trueの場合、数字のみが入力された場合は、のインスタンスをチェックし、入力が編集テキストにのみnumerals.Run Java正規表現^[0-9]*$で、クリーンであることを確認することができます前に、input instanceof Double

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

、その後、使用Double.valueOf(val)またはDouble.parse()唯一の違いは、後者はDouble型のオブジェクトを返します。もう一方はプリミティブ型を返します。

+0

にポストバックします。その後、入力値に対して任意の算術演算を実行できます。 – Remario

+0

また、try catchブロックですべての計算を囲むのは良い方法ではありません。 catchブロックはすべての例外に対して例外(スーパークラス)をキャッチします。このようにすれば、もしあればすべての例外をキャッチできます。 – Remario

+0

しかし、コードスニペットは常に文字列を返しませんか? – Luis