2012-10-07 96 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)'強制轉換總是會將'Integer.MAX_INTEGER'留在'account'中。 –

回答

1

而不是做

account =interest +base 

的你應該有

account = interest +account 
+0

釘住它!謝謝 – ParaChase

1

您應該添加一些理智檢查。檢查是否所有的數字都會導致有限數量的循環(accountrate!= 0,也許還有其他一些東西),或者更簡單地說,如果循環次數多於合理次數(例如1000) 。我的猜測是rate0導致帳戶沒有增加,因此它將永遠循環。

你有一個計算錯誤:

account = interest + base; 

據推測,這應該是:

account = account + interest; 

另外,你確定你想擁有INT投?

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

顯然你丟掉了小於1分的值。但是,如果利息太少,你就不會有任何變化。

+0

用戶輸入數字時,不應該改變費率嗎?無論如何,我會嘗試 – ParaChase

+0

@ChaseYuan是的,但我猜測他們可能輸入0,或者像Bohemian指出的那樣,數字太小。 – CrazyCasta

+0

好的,所以我已經把它移到了代碼打印出來之前,所以它不應該直到最後才結束。 – ParaChase

0

的原因,它可能永遠循環下去是,accountdouble計算有效地鑄造int截斷,因此如果rate太小和account新的價值不是由至少0.005變大,可能永遠不會改變。

+0

也許,它也可能是那個比率被設置爲0. – CrazyCasta