我有一個<input>
元素,我爲其設置了opacity: 0.3
。但是,當我檢查實際值時,我得到0.30000001192092896。請參閱http://jsfiddle.net/85EPf/2/CSS不透明度定義爲0.3,但設置爲0.30000001192092896
爲什麼我會得到此差異?如果這不是一個錯誤,我怎麼能預測其他值的差異?
我有一個<input>
元素,我爲其設置了opacity: 0.3
。但是,當我檢查實際值時,我得到0.30000001192092896。請參閱http://jsfiddle.net/85EPf/2/CSS不透明度定義爲0.3,但設置爲0.30000001192092896
爲什麼我會得到此差異?如果這不是一個錯誤,我怎麼能預測其他值的差異?
這是又一個浮點數與十進制數舍入問題。見"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:這是* your * JS實現的精確性,而不是在OP使用的任何瀏覽器中實現CSS。也許它只使用單精度浮點數。 –
不,[JS規格](http://www.ecmascript.org/docs.php)使用[IEEE 754,雙精度](http://steve.hollasch.net/cgindex/coding/ieeefloat.html )。向我展示一個使用不同精度的瀏覽器。 –
正如有人說,這是事實的結果是floating-point numbers are approximations in JS(和幾乎所有其他計算機語言。)
如果你想測試對一個值的不透明度,首先要決定如何接近足夠接近。例如,該測試,看看它是否等於0.3,在3位小數:
if (300 == Math.round (opactityVal * 1000)) {
//-- Do something here.
}
*即使CSS *不能從浮點數轉義? – thirtydot
我很困惑,你的js小提琴與這個問題無關。 – Dan
更正!謝謝。 (沒有刷新小提琴。) – Randomblue