2015-04-15 6 views
13

मैं निम्नलिखित सीएसएस नियम का उपयोग div की पृष्ठभूमि का रंग सेट करने के लिए: डेवलपर उपकरण मैं इस परिणाम rgba(96, 96, 96, 0.0980392); देखने की 'परिकलित' टैब मेंGoogle क्रोम पृष्ठभूमि अस्पष्टता क्यों बदलता है?

div { 
    background-color: rgba(96, 96, 96, .1); 
} 

गूगल क्रोम v.42 में। मुझे लगता है कि, यह कुछ वेब किट अनुकूलन की तरह दिखता है ...

फ़ायर्फ़ॉक्स v.36 गणना की पृष्ठभूमि का रंग में rgba(96, 96, 96, 0.1)

लिए मैं एक साधारण http://jsfiddle.net/sergfry/c7Lzf5v2/ है कि यह कार्रवाई में चलता कर दिया है बराबर होती है।

तो, क्या मैं Google क्रोम में अस्पष्टता को बदलने से रोक सकता हूं?

धन्यवाद!

+4

शायद सिर्फ आईईईई चल बिन्दु मुद्दा। इसके बारे में चिंता मत करो। – Quentin

+0

लेकिन यदि आप आउटपुट के हेक्स/आरजीबी मान की जांच करते हैं, तो यह वही #Efefef हेक्स और आरजीबी 23 9 के रूप में है .. आउटपुट अन्य ब्राउज़रों के समान है .. इसलिए इस बारे में कोई बात नहीं है :) –

उत्तर

13

क्विंटिन द्वारा बताए गए अनुसार, यह एक आईईईई फ्लोटिंग पॉइंट मुद्दा है।

0.1 वास्तव में बाइनरी काम करने के तरीके के कारण तकनीकी फ़्लोटिंग पॉइंट में वास्तव में मौजूद नहीं है।

0.1 एक-दसवां, या 1/10 है। बाइनरी में यह दिखाने के लिए, बाइनरी 1010 से विभाजित द्विआधारी 1, द्विआधारी लंबे विभाजन का उपयोग कर:

enter image description here

आप देख सकते हैं, 0.1 बाइनरी में 0.0001100110011....0011 है और यह अनंत को अंत पर 0011 दोहरा रखेंगे।

ब्राउज़र 0.1 पर सबसे नज़दीकी उपलब्ध बिंदु चुनने और चुनने के बजाय इसका उपयोग अस्पष्टता के रूप में करेंगे। कुछ खत्म हो जाएंगे और कुछ नीचे जायेंगे।

फ़ायरफ़ॉक्स मुझे लगता है कि यह सिर्फ मानव पठनीय संस्करण दिखा रहा है लेकिन वास्तव में, यह वास्तव में एक कंप्यूटर उपयोग करने योग्य फ़्लोटिंग बिंदु का उपयोग कर रहा है।

एक उदाहरण के रूप:

body { 
    color: rgba(0,0,0,0.1); // actually 0.0980392 
    opacity: 0.1; // actually 0.100000001490116 
} 

दो बिल्कुल एक ही फ्लोटिंग बिंदु के लिए पूरी तरह से अलग मान।

यह फ़्लोटिंग पॉइंट समस्या वास्तव में जावास्क्रिप्ट जैसी अन्य भाषाओं का उपयोग करके ब्राउज़रों के भीतर कहीं और दोहराया जा सकता है। जावास्क्रिप्ट संख्या हमेशा 64 बिट फ्लोटिंग पॉइंट (जो मुझे विश्वास है कि सीएसएस भी है)। इसे आमतौर पर डबल-प्रेसिजन फ्लोटिंग पॉइंट के रूप में जाना जाता है। PHP डबल-प्रेसिजन फ्लोटिंग पॉइंट्स का भी उपयोग करता है।

64 बिट फ्लोटिंग पॉइंट नंबर जैसा कि आप अनुमान लगा सकते हैं, 64 बिट्स में संग्रहीत किया जा सकता है, जहां संख्या (अंश) बिट्स 0 से 51 में संग्रहीत है, 52 से 62 बिट्स में एक्सपोनेंट है, और बिट 63 में साइन है।

इससे समस्याएं नीचे आती हैं क्योंकि इसका मतलब है कि पूर्णांक केवल 15 दशमलव अंकों तक सटीक के रूप में गिना जाता है और वास्तव में केवल 17 दशमलव अंक की गणना कर सकता है।

इसका मतलब है कि संख्याएं बहुत आसानी से गोल हो सकती हैं या बस सही ढंग से संग्रहीत नहीं की जा सकती हैं।

var x = 999999999999999; // x = 999999999999999 
var y = 9999999999999999; // y = 10000000000000000 

चल अंक भी संरेखण से बाहर हो सकता है काफी एक बहुत से स्थानों में रूप में अच्छी तरह के लिए गणित।जैसा कि मैंने ऊपर दिखाया है; दशमलव में 0.1 वास्तविक नहीं है 0.1 लेकिन 0.000110011... और इसी तरह। इसका मतलब है कि कुछ बुनियादी गणित पूरी तरह गलत हो सकते हैं।

var x = 0.2 + 0.1; // x = 0.30000000000000004 

आप जिस नंबर को वास्तव में चाहते हैं उसे पाने के लिए सिस्टम को भ्रमित करने के लिए समाप्त हो जाते हैं। यह * द्वारा 10 द्वारा किया जा सकता है और फिर इसे अपने वास्तविक इच्छित परिणाम प्राप्त करने के लिए विभाजित किया जा सकता है। चल बिन्दु कंप्यूटर के भीतर

var x = (0.2 * 10 + 0.1 * 10)/10; // x = 0.3 

प्रेसिजन बहुत मुश्किल है और जब वहाँ कई अलग अलग कार्यान्वयन (या ब्राउज़र) कर रहे हैं और भी मुश्किल है गति के लिए अपना सर्वश्रेष्ठ करने का प्रयास कर और जानकारी वे सही ढंग से दिया जाता है प्रदर्शित।

फ़्लोटिंग पॉइंट्स के बारे में जानकारी के कुछ अलग-अलग टुकड़े हैं और सीएसएस प्रोसेसर (या जेएस जैसा कि मैं अपेक्षा करता हूं कि गणना समान होगी) प्राप्त करने की कोशिश कर रहे हैं।

+2

धन्यवाद आपके उत्तर के लिए बहुत कुछ, स्टीवर्टसाइड ! – Sergey

संबंधित मुद्दे