2012-10-08 39 views
1

我正在處理一個CS任務,並且Im有點麻煩了解如何輸出一個雙精度數組,代表銀行帳戶中的金錢數量,給定用戶的時間增量指定增長率。我有一個主要方法,要求用戶輸入$的initialAmount,增長率和時間間隔的數量(表示初始金額,增長率和期間數量分別爲iA,gR和nP)。這個方法然後調用另一個返回類型爲double []的方法。我的問題是與我的for循環內的代碼,它編譯罰款,但輸出亂碼。繼承人的代碼:java中的指數增長,返回類型的雙打數組

import java.util.Scanner; 

public class Benford { 
    public static double[] generateBenfordNumbers (double iA, double gR, int nP) { 
     double[] bankStatement = new double[nP]; 

     for (int i = 0; i<nP; i++) { 
      bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++)))); 
     } 

     return bankStatement; 
    } 

    public static void main (String[] args) { 
     Scanner scan = new Scanner(System.in); 
     double iA; 
     double gR; 
     int nP; 

     System.out.print("What is the initial amount of money that you are starting with? : "); 
     iA = scan.nextDouble(); 
     System.out.println(); 

     System.out.print("What is the amount of growth per time period? : "); 
     gR = scan.nextDouble(); 
     System.out.println(); 

     System.out.print("How many time periods would you like to use? : "); 
     nP = scan.nextInt(); 
     System.out.println(); 

     generateBenfordNumbers(iA, gR, nP); 
     System.out.print(generateBenfordNumbers(iA, gR, nP)); 
    } 
} 
+1

你是什麼意思的亂碼輸出?究竟是什麼打擾你? – devrys

回答

2

在線路

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++)))); 

i++增量i第二次。你可能想:

bankStatement[i] = (iA*(Math.pow((1+(gR)), i + 1))); 

,或者,如果我們清理,

bankStatement[i] = iA * Math.pow(1 + gR, i + 1); 

i + 1返回一個值1比的i更大,但實際上並沒有增加變量本身。


另外,你真的要每次使用Math.pow?難道你不能只是手動設置您的陣列的第一個元素爲iA,隨後使用bankStatement[i-1]來計算bankStatement[i]?做這樣的事情可能會改善你的計劃。

+0

感謝一堆,這做的伎倆,只有當我使用一個簡單的例子,如:iA = 100,gR = .10,nP =任何,我得到[100.0,110.00000000001,121.00000000001等,只是想弄清楚爲什麼即時獲得這些微小的部分。再次感謝! – user1730099

+0

@ user1730099看看[this](http://stackoverflow.com/questions/327544/strange-floating-point-behaviour-in-a-java-program)。 – arshajii

1

i遞增兩次:在循環水平和進入體內

0

你不應該在你對Math.pow的調用中增加我。這是因爲你已經在for循環中增加了它。結果是數組的元素被跳過而未設置。這可能是胡言亂語來自何處。

你可能想改變:

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++)))); 

要:

bankStatement[i] = iA*Math.pow(1+gR, i); 

另外,順便說一句,你一般不應使用這麼多的括號,因爲它使得它難以閱讀。如果您不確定操作順序是什麼,look it up

1

的亂碼輸出看起來像這樣:

[[email protected] 

這是S雙陣列文本表示。你可以使用:

System.out.print(Arrays.toString(generateBenfordNumbers(iA, gR, nP))); 
0

其他人說,你增加我兩次,所以我不會重複這一點。我只想補充一點,方括號可以很好地組織公式並確保計算的正確執行順序,但是如果過度使用它們,它們可能會混淆程序的意圖,並且可能會使您難以發現的問題更容易發現。比較

bankStatement[i] = iA * Math.pow(1.0 + gR, i+1); 

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i)))); 

明白我的意思嗎?

編輯 - 在ARS關於i的初始值的非常有效的評論後,我改變了清理後的陳述。