यदि अभी भी कोई भी इसी पृष्ठ के साथ इस पृष्ठ तक पहुंचता है जहां फ़्लोटिंग संख्या घटाव त्रुटि या अजीब मानों का कारण बनता है। मैं इस समस्या को थोड़ा और विवरण के साथ समझाऊंगा। अपराधी फ्लोटिंग पॉइंट नंबर है। और विभिन्न ऑपरेटिंग सिस्टम और प्रोग्रामिंग भाषाओं के विभिन्न संस्करण अलग-अलग व्यवहार कर सकते हैं।
समस्या का वर्णन करने के लिए, मैं समझाऊंगा कि नीचे एक सरल उदाहरण क्यों है।
यह सीधे PHP से संबंधित नहीं है और यह एक बग नहीं है। हालांकि, प्रत्येक प्रोग्रामर को इस मुद्दे से अवगत होना चाहिए।
इस समस्या ने दो दशकों पहले भी कई जान ली।
25 फरवरी 1 99 1 को एमआईएम-104 देशभक्त मिसाइल बैटरी में फ्लोटिंग नंबर गणना में इस समस्या ने इसे अमेरिकी सेना के 14 वें क्वार्टरमास्टर डिटेचमेंट से 28 सैनिकों की मौत में योगदान देने वाले धहरान, सऊदी अरब में आने वाली स्कड मिसाइल को रोक दिया।
लेकिन ऐसा क्यों होता है?
कारण यह है कि फ़्लोटिंग पॉइंट मान सीमित परिशुद्धता का प्रतिनिधित्व करते हैं। इसलिए, पर कोई मान किसी भी प्रसंस्करण के बाद समान स्ट्रिंग प्रस्तुति नहीं हो सकता है। यह भी में आपकी स्क्रिप्ट में एक फ़्लोटिंग पॉइंट वैल्यू लिखना और सीधे किसी भी गणितीय परिचालन के बिना प्रिंट करना शामिल है।
बस एक साधारण उदाहरण:
$a = '36';
$b = '-35.99';
echo ($a + $b);
आप इसे 0.01, सही मुद्रित करने के लिए उम्मीद करेंगे? लेकिन यह 0.0099 99 99 99 99 998
अन्य नंबरों की तरह, एक फ्लोटिंग पॉइंट नंबर डबल या फ्लोट को 0 और 1 की स्ट्रिंग के रूप में स्मृति में संग्रहीत किया जाता है।पूर्णांक से कितना फ़्लोटिंग पॉइंट अलग होता है यह है कि हम 0 और 1 की व्याख्या कैसे करते हैं जब हम उन्हें देखना चाहते हैं। कई मानक हैं कि वे कैसे संग्रहीत हैं।
फ्लोटिंग-बिन्दु संख्या आम तौर पर संकेत बिट, प्रतिपादक क्षेत्र, और significand या अपूर्णांश के रूप में एक कंप्यूटर गृहीत में पैक कर रहे हैं सही ....
दशमलव संख्या में अच्छी तरह से बाइनरी में प्रतिनिधित्व नहीं है बाएं से पर्याप्त जगह की कमी के कारण। तो, आप 1/3 बिल्कुल स्पष्ट नहीं कर सकते क्योंकि यह 0.3333333 है ..., है ना? हम एक कारण के लिए 0.01 का प्रतिनिधित्व नहीं कर सकते हैं क्योंकि बाइनरी फ्लोट नंबर एक ही कारण है। 1/100 0.00000010100011110101110000 है ..... एक दोहरा 10100011110101110000.
0.01 बाइनरी में 01000111101011100001010, जब यह वापस दशमलव के अनुवाद किया है के सरलीकृत और सिस्टम छोटा कर दिया के रूप में रखा गया है, तो के साथ, यह .००,९९,९९९ की तरह पढ़ कर दिया जाएगा। ... सिस्टम के आधार पर (64 बिट कंप्यूटर आपको 32-बिट्स से बेहतर परिशुद्धता देगा)। ऑपरेटिंग सिस्टम इस मामले में फैसला करता है कि इसे प्रिंट करना है या नहीं, इसे अधिक मानव-पठनीय तरीके से कैसे बनाया जाए। इसलिए, यह मशीन-निर्भर है कि वे इसका प्रतिनिधित्व कैसे करना चाहते हैं। लेकिन इसे विभिन्न तरीकों से भाषा स्तर में संरक्षित किया जा सकता है।
यदि आप परिणाम स्वरूपित करते हैं, तो echo number_format (0.009999999999998, 2); यह 0.01 प्रिंट करेगा।
ऐसा इसलिए है क्योंकि इस मामले में आप निर्देश देते हैं कि इसे कैसे पढ़ा जाना चाहिए और आपको कितनी सटीकता की आवश्यकता है।
अधिक व्यापक, PHP-wide परिवर्तनों के लिए php.ini में 'सटीक' की जांच करें। हालांकि, सलाह दीजिये कि आप * महत्वपूर्ण अंकों * से निपट रहे हैं। –