2016-09-19 4 views
0

Ich möchte den gleitenden Durchschnitt der Bestandsdaten unter Verwendung der folgenden Formel aktiv berechnen:Wie wird ein anfänglicher gleitender Durchschnittswert in Java festgelegt?

public class Average { 

    private static double usdJpy; 
    private int counter = 1; 

    private double movingAverageUsdJpy_ = 100.5; 

    public void calculateAverage(){ 

     ReadData myData = new ReadData(); 

     usdGbp = myData.getUsdGbp(); 
     usdJpy = myData.getUsdJpy(); 

     System.out.println("Before: " + movingAverageUsdJpy_); 

     movingAverageUsdJpy_ = (counter * movingAverageUsdJpy_ + usdJpy)/(counter + 1); 

     counter++; 

     System.out.println("Moving Average: " + movingAverageUsdJpy_); 
    } 

} 

-> Zähler die Anzahl der Elemente im Array ist.

Meine Frage ist, da die Bestandsdaten bereits einen gleitenden Durchschnitt haben, möchte ich meine anfängliche MovingAverage-Wert zu diesem setzen (z. B. 97.883). Jedes Mal, wenn ich meine Methode anrufe, wird der letzte Wert, den mein Programm für den MovingAverage berechnet hat, jedoch mit dem Anfangswert überschrieben, den ich zuvor festgelegt habe, was zu einem falschen Ergebnis führt. Ich kann das Finale nicht wirklich verwenden, da der MovingAverage jedes Mal aktualisiert werden muss, wenn ich die Methode so richtig feststelle!

Gibt es eine Möglichkeit, dieses Problem zu beheben?

+0

declare MovingAverage als global ist, nicht innerhalb der Methode –

+1

Nur für das Protokoll: Sie sind sich der Tatsache bewusst, dass ** Doppel ** Macht nicht etwas zu verwenden, wenn man Berechnungen mit Geld macht? – GhostCat

+0

Ich bin ein Anfänger, also was ist der beste Typ im Umgang mit Geld? – Emir54

Antwort

2

Ihre Formel ist falsch. Wenn counter der noch nicht erhöhten Wert ist, dann verwenden

movingAverage = (counter * movingAverage + latestRate)/(counter + 1)

Dann counter erhöhen um 1. Beachten Sie, dass, wenn Sie counter wollen eine feste Größe werden (wie durchaus üblich ist, wenn finanzielle Daten wie diese Berichterstattung) , dann müssen Sie diese Anzahl von Elementen im Speicher behalten.

+0

eine prägnantere Art wäre 'movingAverage = (counter * movingAverage + latestRate)/++ counter;'. Auf diese Weise müssen Sie den Zähler nicht separat inkrementieren. – yitzih

+0

Das stimmt in Java, aber beachten Sie, dass in C und C++ das Verhalten dieses Ausdrucks * undefiniert * wäre. Also würde ich es immer auf meine Art schreiben. Fühlen Sie sich frei, die Frage mit diesem Ausdruck zu beantworten; Mal sehen, was Java-Leute denken. – Bathsheba

0

Sie haben wahrscheinlich so etwas wie:

class Something{ 
    public int calculateAverage(){ 
    int movingAverage = 98888; 
    //more code to count average 
    } 
} 

Was Sie tun müssen, ist:

class Something{ 
    private int myAverage = 98888; 

    public int calculateAverage(){ 
    //code to calculate using myAverage variable; 
    } 
} 
+0

Fügen Sie Ihren ganzen Code in Hauptpost, ganze Methode und wo Sie all dies aufrufen. – Shadov

+0

Auch wenn ich myAverage als global setze, wird jedesmal, wenn calculateAverage() in meiner while-Schleife aufgerufen wird (dh jede Minute), der neueste movingAverage durch den initial myAverage ersetzt. Um die Dinge in einen Zusammenhang zu bringen, hier ist mein Terminal -> Before [1] Berechnung: 100.5, MovingAverage: 101.15, USD/JPY Rate ist: 103.58, Vorher [2]: 100.5 -> Der Vorher-Wert ist auf MovingAverage gesetzt, aber es ist einfach nimmt den Wert, den ich anfangs im global deklariert habe. Der Wert für vor [2] soll 101.15 sein, ist es aber nicht. – Emir54

+0

Zeigen Sie uns, wo Sie diese Methode aufrufen, dh wo Sie 'calculateAverage();' berechnen. Sind Sie sicher, dass Sie keine weitere Instanz von Average erstellen? Vielleicht tue dies: Ignoriere alles, was ich gerade geschrieben habe, und füge 'movingAverageUsdJpy_' 'statisch' hinzu, das ist 'private double static movingAverageUsdJpy_'. – Shadov

-1

Erstellen Sie ein neues privates Feld zum Speichern der vorherigen Durchschnitt verwendet. Ich bin nicht sehr vertraut mit Moving-Averages pro Wort, aber mit der Formel, die du zur Verfügung gestellt hast, habe ich die Dinge etwas angepasst. Hinweis, in der Regel wird ein Unterstrich verwendet, um anzuzeigen, dass eine Klassenstufe Variable private

private double movingAverage_; 
private double prevAverage_ = 97.883; 

public void calculateMovingAverage() 
{ 
    movingAverage_ = prevAverage_ + (latestRate - prevAverage_)/counter; 
    prevAverage_ = movingAverage_; 

    // finish other logic 
} 
Verwandte Themen