以下の計算式を使用して在庫データの移動平均を積極的に計算したいと考えています。
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_);
}
}
- > Counterは、配列内の要素の数です。
私の質問は、株式データにはすでに移動平均を使用して、最初のmovingAverage値をそれに設定したい(たとえば97.883)。しかし、私がメソッドを呼び出すたびに、私のプログラムがmovingAverageのために計算した最新の値は、私が以前に設定した初期値によって上書きされるため、私に間違った結果がもたらされます。 moveAverageはメソッドを呼び出すたびに更新される必要があるので、私は実際にファイナルを使用することはできません。
この問題を解決する方法はありますか?
回答:
回答№1は2あなたの数式は間違っています。もし counter
まだインクリメントされていない値です
movingAverage = (counter * movingAverage + latestRate) / (counter + 1)
その後、インクリメント counter
もしあなたが望むならば counter
(このような財務データを報告するときにはかなり一般的ですが)サイズを固定するには、その数の要素をメモリに保持する必要があります。
回答№2の場合は0
おそらく次のようなものがあります:
class Something{
public int calculateAverage(){
int movingAverage = 98888;
//more code to count average
}
}
あなたがする必要があるのは次のとおりです:
class Something{
private int myAverage = 98888;
public int calculateAverage(){
//code to calculate using myAverage variable;
}
}
回答№3の場合は-1
新しいプライベートフィールドを作成します。前の平均。私は、言葉ごとの移動平均にはあまりよく慣れていませんが、あなたが用意した公式を使って私は少し調整しました。通常、下線はクラスレベルの変数が private
private double movingAverage_;
private double prevAverage_ = 97.883;
public void calculateMovingAverage()
{
movingAverage_ = prevAverage_ + (latestRate - prevAverage_)/counter;
prevAverage_ = movingAverage_;
// finish other logic
}