1

Flash で新しい AS3 ドキュメントを作成、次のコードを貼り付けて実行します。

var a:Number=0;
trace(a)  //  0
a+=0.3;
trace(a)  //  0.3
a+=0.3;
trace(a)  //  0.6
a+=0.3;

trace(a)  //  0.8999999999999999
a+=0.3;
trace(a)  //  1.2
a+=0.3;
trace(a)  //  1.5
a+=0.3;
trace(a)  //  1.8
a+=0.3;
trace(a)  //  2.1
a+=0.3;
          //  ^ This is the output. Notice the inaccuracy starting from 0.9 / 0.89

エラーの理由 私は普通の高解像度の追加をしているだけです。

回避策はありますか?

4

2 に答える 2

8

これは標準的な浮動小数点問題です。2 進浮動小数点数は、完全な精度で 10 進数の全範囲を表すわけではありません。

trace (round (a, 1))

または、それを文字列に変換し、最初の小数桁を超えるすべてを削除することをお勧めします (丸めの結果もバイナリで簡単に表現できない可能性があるため)。

私はActionScriptを知りませんが。それでも、これは非常によく知られている問題であり、AS3 に限定されません。

たとえば、21.399999618530273 のように 21.4 のような値に初期化された double 変数が表示されるのはなぜですか? またはJava プログラムでの奇妙な浮動小数点の動作または浮動小数点/丸めエラーの簡単な例は何ですか? .

于 2008-12-14T02:59:31.917 に答える
0

回避策の1つは、スケーリングされた整数型を使用することです。この例では、出力の直前に3ずつインクリメントしてから、10で除算することができます。これにより、浮動小数点演算に固有のすべての丸め誤差が回避されます。

于 2008-12-14T06:08:01.333 に答える