<input>
要素があります。opacity: 0.3
です。しかし、私が実際の値をチェックすると、私は0.30000001192092896が得られます。 http://jsfiddle.net/85EPf/2/0.3で定義されているが、0.30000001192092896に設定されたCSS不透明度
この不一致はなぜ発生しますか?これがバグでない場合は、他の値の不一致をどのように予測できますか?
<input>
要素があります。opacity: 0.3
です。しかし、私が実際の値をチェックすると、私は0.30000001192092896が得られます。 http://jsfiddle.net/85EPf/2/0.3で定義されているが、0.30000001192092896に設定されたCSS不透明度
この不一致はなぜ発生しますか?これがバグでない場合は、他の値の不一致をどのように予測できますか?
これは、もう1つの浮動小数点数と10進数の丸めの問題です。 "What Every Computer Scientist Should Know About Floating-Point Arithmetic"を参照してください。
あなたは本当に不平等に気を付ける必要はありません。浮動小数点数の場合、正確に0.3を表現することはできません。 0.30000001192092896は十分に近いです。他の人が言ったように
"あなたは本当に不一致に気を付ける必要はありません" - >実際には、私は不具合を見つけた後に不一致を見つけました。これがバグの原因でした。 – Randomblue
コードは浮動小数点数の比較に依存していたのでしょうか?それはお勧めできません。 – Jacob
はい。よりよいアプローチは何ですか? – Randomblue
内部のバイナリで表される浮動小数点数は正確ではありません。あなたの値0.30000001192092896は、コンピュータがバイナリで0.3を表すのに最も近い値です。
いいえ、それはありません! JSフロートは約15桁まで正確です。 'console.log(0.3000000000000001、 '|'、0.3000000000000001 + 0.0000000000000001);' –
@Brock Adams:JSの実装の精度であり、OPが使用しているブラウザのCSSの実装ではありません。多分単精度浮動小数点を使用しているだけかもしれません。 –
[JS spec](http://www.ecmascript.org/docs.php)は[IEEE 754、倍精度]を使用しています(http://steve.hollasch.net/cgindex/coding/ieeefloat.html )。 CSSに異なる精度を使用するブラウザを表示してください。 –
が、これは事実の結果であること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位の中、見にテストします。
* CSS *でも浮動小数点数からエスケープできませんか? – thirtydot
私は混乱しています、あなたのjのバイブルはこの質問とは関係ありません。 – Dan
修正済み!ありがとう。 (フィドルをリフレッシュしませんでした) – Randomblue