2011-08-02 15 views
0

これは私のコードは次のようになります。条件文の二重値の丸め誤差を避けるには?現時点で

if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX == 0){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

どのように私はこれを達成することができます:ここで

if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX < 0.0001){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

は、私はそれがどのように見えるしたいのですが何ですか? double値(scaleXとは)実際にあなたが寛容のいくつかの並べ替えを定義したい0

答えて

2

ことはありませんので、その後の操作を行います。

if (Math.abs(scaleX) < tolerance) 

あなたは正確ゼロという値をチェックするべきではありません - ちょうど "ゼロに近い"。これは、バイナリ浮動小数点型の人生のやり方です。 "0.1"や "0.0001"のようなものは、バイナリ浮動小数点では表現できません。そのため、このようなことに遭遇します。

それははっきりしていない、あなたの元のコードを好きではない理由を、そしてあなたはそれが第二の形式になりたい理由。絶対値をとらない以外は、最初のコードは大丈夫です。

+0

ありがとうございました。私はちょうどその方法でコード化し、後でそれに戻ってくると思ったので、周りに素敵な方法があるかもしれないと思った。そして私はここにいる。 :)しかし、ありがとう、私は定数を抽出し、 "十分に近い"アプローチに固執します。 – rtheunissen

1

浮動小数点数演算では、2の64乗の二倍の値しかないため、正確な結果は得られないため、できません。数字の

1

浮動小数点演算を使用するときは、概念的には等価ではなく「かなり近い」と書くのが普通です。

if (x - y < verySmallValue) 

ではなく

if (x == y) 

あなたyが0であるので、あなたは私がコンセプトで罰金だと思う

if (x < verySmallValue) 

を書いています。

0

変数の用途に応じて、BigDecimalクラスを使用できます。