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