2011-08-03 6 views
2

<input>要素があります。opacity: 0.3です。しかし、私が実際の値をチェックすると、私は0.30000001192092896が得られます。 http://jsfiddle.net/85EPf/2/0.3で定義されているが、0.30000001192092896に設定されたCSS不透明度

この不一致はなぜ発生しますか?これがバグでない場合は、他の値の不一致をどのように予測できますか?

+2

* CSS *でも浮動小数点数からエスケープできませんか? – thirtydot

+1

私は混乱しています、あなたのjのバイブルはこの質問とは関係ありません。 – Dan

+0

修正済み!ありがとう。 (フィドルをリフレッシュしませんでした) – Randomblue

答えて

6

これは、もう1つの浮動小数点数と10進数の丸めの問題です。 "What Every Computer Scientist Should Know About Floating-Point Arithmetic"を参照してください。

あなたは本当に不平等に気を付ける必要はありません。浮動小数点数の場合、正確に0.3を表現することはできません。 0.30000001192092896は十分に近いです。他の人が言ったように

+0

"あなたは本当に不一致に気を付ける必要はありません" - >実際には、私は不具合を見つけた後に不一致を見つけました。これがバグの原因でした。 – Randomblue

+1

コードは浮動小数点数の比較に依存していたのでしょうか?それはお勧めできません。 – Jacob

+0

はい。よりよいアプローチは何ですか? – Randomblue

1

内部のバイナリで表される浮動小数点数は正確ではありません。あなたの値0.30000001192092896は、コンピュータがバイナリで0.3を表すのに最も近い値です。

+1

いいえ、それはありません! JSフロートは約15桁まで正確です。 'console.log(0.3000000000000001、 '|'、0.3000000000000001 + 0.0000000000000001);' –

+0

@Brock Adams:JSの実装の精度であり、OPが使用しているブラウザのCSSの実装ではありません。多分単精度浮動小数点を使用しているだけかもしれません。 –

+0

[JS spec](http://www.ecmascript.org/docs.php)は[IEEE 754、倍精度]を使用しています(http://steve.hollasch.net/cgindex/coding/ieeefloat.html )。 CSSに異なる精度を使用するブラウザを表示してください。 –

1

が、これは事実の結果であることfloating-point numbers are approximations in JS(および他のほとんどすべてのコンピューター言語。)

あなたは値に対して不透明度をテストする場合は、最初に十分に近いどれだけ近いかを決めます。また

if (300 == Math.round (opactityVal * 1000)) { 
    //-- Do something here. 
} 

を参照してください、Minimizing the effect of accuracy problems:例えば、これは0.3に等しいかどう小数点第3位の中、見にテストします。

関連する問題