0

問題:ダブルマイナス別のダブルが不正確な結果を返しています。

通常の解決策:大きな小数を使用して計算を実行します。

これはゲームループの途中であるため使用できません。メモリが不足しているゲームループ内で、newで作成された場合にのみ、値で大小数を設定できます。

どのような解決策ですか?

コードは次のとおりです。

public void UpdateStatsBar(double WorldPopulation, double WorldDead)
{
    Number = mOriginalPopulation - WorldPopulation;
}

私が使用している種類の数値は、数十億に達し、数十桁の深さになります(統計の平均)例:1432,323,234.234215232425322342

4

1 に答える 1

2

10進数の人が生きているか死んでいるかを知ることができないと仮定すると、私はを使用しますlong

正確な結果が得られない、使用している数値の例を教えてください。

ところで:9000兆未満の整数を使用するdoubleと、正確な結果が得られます。

ところで2:あなたnew BigDecimalが狂ったように作成するがそれらを保持しない場合、あなたはパフォーマンスを損なうでしょうが、あなたはメモリを使い果たすことはありません。メモリが不足している場合は、BigDecimalを使用する必要はありません。問題の真の原因を見つけるために、メモリプロファイラーを使用することをお勧めします。

BigDecimal bd = BigDecimal.ZERO;
long l = 0;
double d = 0;
while (true) {
    for (int i = 0; i < 100000000; i++) {
        bd = bd.add(BigDecimal.ONE);
        l++;
        d++;
    }
    System.out.println("counting bd: " + bd + " l: " + l + " d:" + d);
}

BigDecimal、longおよびdoubleでカウントする数値を出力します。doubleの形式は異なりますが、値は同じです。

counting bd: 100000000 l: 100000000 d:1.0E8
counting bd: 200000000 l: 200000000 d:2.0E8
counting bd: 300000000 l: 300000000 d:3.0E8
... deleted ...
counting bd: 1900000000 l: 1900000000 d:1.9E9
counting bd: 2000000000 l: 2000000000 d:2.0E9
counting bd: 2100000000 l: 2100000000 d:2.1E9
counting bd: 2200000000 l: 2200000000 d:2.2E9
... deleted ...

-mx2mヒープを2MBに制限しても、メモリが不足することはありません。

于 2012-09-19T19:02:41.480 に答える