2012-10-07 7 views
0

두 배가 될 때까지 투자를 계산하는 데 사용 된 코드를 통해 해결할 수없는 무한 루프가 발생했습니다. 왜 이것이 내게 무한 루프를주고 있는지 알아낼 수 있습니까? 나는 나 자신을 지났지 만 문제를 찾을 수없는 것 같습니다. 언급 된 "기간"은 일년에 몇 번이자가 복리가 되는가입니다.왜 이렇게하면 무한 루프가 생깁니 까?

double account = 0; //declares the variables to be used 
    double base = 0; 
    double interest = 0; 
    double rate = 0; 
    double result = 0; 
    double times = 0; 
    int years = 0; 
    int j; 

    System.out.println("This is a program that calculates interest."); 
    Scanner kbReader = new Scanner(System.in); //enters in all data 
    System.out.print("Enter account balance: "); 
    account = kbReader.nextDouble(); 
    System.out.print("Enter interest rate (as decimal): "); 
    rate = kbReader.nextDouble(); 

    System.out.println("     " + "Years to double" + "  " +  "Ending balance"); 
    base = account; 
    result = account; 
    for (j=0; j<3; j++){ 
     System.out.print("Enter period: "); 
     times = kbReader.nextDouble(); 
     while (account < base*2){ 
      interest = account * rate/times; 
      account = interest + base; 
      years++; 
     } 
     account = (((int)(account * 100))/100.0); 
     //results 
     System.out.print("       " + i + "    " + account + "\n"); 
     account = result; 
    } 

코드는 세 가지 "기간"을 요청해야한다, 또는 세 개의 서로 다른 시간에 입력 한 데이터는 (매년 전을, 매월, 매일 등) 연간 복잡해집니다

고마워요!

+0

당신이 코드에 중단 점을 설정하고 그것을 통해 스테핑이 디버깅을 시도해야합니까? – Bohemian

+0

아니요, 제가 사용하고있는 IDE가 비교적 새로운 BlueJ입니다. 의견 있으십니까? – ParaChase

+0

'int'에 대한 캐스트가'account'를 base의 값 아래로 떨어 뜨리지 않는다고 보장 할 수는 없습니다. 'base * 2> = Integer.MAX_INTEGER'이면. 또한'times'이 0이기 때문에'(int)'형 변환은 항상'account'에'Integer.MAX_INTEGER'를 남겨 둘 것이라고 믿습니다. –

답변

1

당신은

account = interest +account 
+0

Nailed it! 감사 – ParaChase

1

몇 가지 온 전성 검사를 추가해야합니다. 모든 숫자가 제한된 수의 루프 (accountrate! = 0, 아마도 다른 것들)가 될 것인지 또는 더 간단하게, 합리적인 것보다 더 많은 시간이 반복되면 중단되는지 (예를 들어 1000 개) . 내 생각 엔 rate0이므로 계정이 증가하지 않으므로 영원히 반복됩니다. 또한,

account = account + interest; 

당신은 INT 캐스트가하겠습니까 :

account = interest + base; 

는 아마도이 있어야한다 :

당신은 계산 오류가?

account = (((int)(account * 100))/100.0); 

분명히 1 센트보다 작은 값을 버리고 있습니다. 그러나 관심이 너무 적 으면 변경 사항이 적용되지 않습니다.

+0

사용자가 숫자를 입력 할 때 속도가 변경되지 않아야합니까? 어쨌든, 내가 시도해 보겠다. – ParaChase

+0

@ChaseYuan 네,하지만 보헤미안이 지적한 것처럼, 숫자가 너무 작을 수도 있습니다. – CrazyCasta

+0

코드가 인쇄되기 전에 바로 이동 했으므로 끝까지 둥글 리면 안됩니다. – ParaChase

0

이유는 그것을 할 수있다 루프는 영원히 accountdouble 계산이 효율적으로 int에 캐스팅에 의해 잘립니다, 그래서 rate가 너무 작고 account의 새로운 값이 적어도 0.005에 의해 크게되지 않는 경우는 절대 변하지 않을 수 있다는 것입니다 . 대신

account =interest +base 

을하는

+0

아마, 그 비율이 0으로 설정되었을 수도 있습니다. – CrazyCasta

관련 문제