2017-04-25 1 views
-1

여기에서 마지막으로 물어 본지 얼마되지 않았습니다. 나는 안드로이드 응용 프로그램을 만드는, 그래서, 아마 여기 아주 사소한 뭔가를 놓친 거지 코드 :자바 계산식 무한 반환

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을 받기 전에 NaN을 없애 버렸지 만 무한하게 보일뿐입니다! 조사한 결과 숫자가 0으로 나뉘어져 있다는 것을 알았지 만 나는 그걸 보지 못했습니다 ... (오, 예, 모든 숫자가 0이 아닌지 확인했습니다)

잘못된 장소에 물건을 넣는 코딩 일 수 있습니까? (그리고 예, 나는 함수와 모든 것을 사용하여 코드를 훨씬 더 잘 만들 수 있다는 것을 알고 있습니다 ...하지만 나는 사람들을 배우고, 저에게 부드럽게 권 해드립니다).

아니면 수학이 잘못되어 극단적으로 높은 것을 반환합니까?

미리 감사드립니다.

+0

입력 방법은 어떻습니까? –

+0

하나의 입력 필드가 문자열을 받아 들일 수있는 것 같아요. 구문 분석 double을 사용하면 전체 문자열을 구문 분석하려고 시도합니다. – Remario

+0

xml의 입력 내용은 모두 이와 비슷하지만 물론 다른 ID가 있습니다. 그리고 @Remario, 이제 instanceof를 실행 중입니다 ... – Luis

답변

1

일부 입력은 실제로 숫자가 아니거나 임의의 임의의 문자열과 섞인 숫자 인 것 같습니다. 입력이 instanceof Double인지 확인하여 텍스트 값 편집에 대한 유효성 검사를 수행하십시오. 사실 만 번호가 입력 된 경우의 예를 확인 입력이 편집 텍스트 만 numerals.Run 자바 정규 표현식 ^[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 블록은 모든 예외에 대해 예외 (수퍼 클래스)를 catch합니다. 이 방법으로 모든 예외를 포착 할 수 있습니다. – Remario

+0

하지만 코드 스 니펫은 항상 문자열을 반환하지 않습니까? – Luis