PHP में, समानता के लिए फ़्लोटिंग पॉइंट मानों का परीक्षण समस्याग्रस्त है, क्योंकि एक फ़्लोटिंग पॉइंट नंबर दूसरे के बराबर है या नहीं, यह जाँचते समय PHP विफल हो रहा है। इस तथ्य के बावजूद कि फ़्लोटिंग पॉइंट नंबरों का एक ही मान है, वास्तव में समान होने की आवश्यकता नहीं है। तो इस लेख में हम फ्लोटिंग-पॉइंट नंबरों की तुलना में समस्या का सामना कर रहे हैं और इस समस्या से बचने के लिए विभिन्न प्रक्रियाओं का प्रदर्शन करेंगे।
उदाहरण
आइए इसे एक साधारण उदाहरण के साथ परखें:
<?php $a = 0.14; $b = 1 - 0.86; //0.14 if($a == $b ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } ?>
आउटपुट:
a and b are not same.
स्पष्टीकरण:
इस कोड में, if कंडीशन के बजाय अन्य कंडीशन निष्पादित की जाती है, भले ही $a और $b समान हों। यह फ़्लोटिंग-पॉइंट मानों की विशेषता के कारण है कि जिस तरह से उनका आंतरिक रूप से प्रतिनिधित्व किया गया था। आइए वास्तविक समय में इस समस्या से बचने के लिए PHP में विभिन्न मामलों पर चर्चा करें।
केस1:
कंप्यूटर सिस्टम में गणना में सबसे छोटे अंतर का उपयोग करके फ़्लोटिंग पॉइंट मानों की तुलना प्रदर्शित करें।
उदाहरण:
<?php $val1 = 2.183459; $val2 = 2.183450; $epsilon = 0.00001; if(abs($val1 - $val2) < $epsilon) { echo "True"; } else { echo "False"; } ?>
आउटपुट:
True
स्पष्टीकरण:
यहां हम एप्सिलॉन के साथ दो फ्लोटिंग पॉइंट वेरिएबल्स वैल1 और वैल2 का उपयोग कर रहे हैं। फिर हम एब्स () नाम के मूल फ़ंक्शन का उपयोग करके चर (वैल 1 और वैल 2) का पूर्ण अंतर लेते हैं। यह कोड हमें निरपेक्ष मान देगा लेकिन सवाल यह है कि हम निरपेक्ष मान क्यों ले रहे हैं? इसका उत्तर यह है कि हम देख सकते हैं कि दशमलव के बाद एक ही अंक वाले दोनों मान सटीक मान 5 तक हैं, जो PHP के लिए तुलना का विश्लेषण करने के लिए कठिन है।
केस 2:
राउंड () फ़ंक्शन का उपयोग।
<?php $val1 = 9 - 6.2; $val2 = 1.8; var_dump(round($val1, 2) == round($val2, 2)); ?>
आउटपुट:
bool(true)
स्पष्टीकरण:
यहां हम दो फ्लोटिंग पॉइंट वेरिएबल्स val1 और val2 का उपयोग कर रहे हैं। फिर हम राउंड () नाम के पूर्वनिर्धारित फ़ंक्शन का उपयोग कर रहे हैं जो दो दशमलव स्थानों तक फ्लोटिंग मानों को राउंड ऑफ करता है और फिर इसकी तुलना करता है। यहां हम अपने अपेक्षित परिणाम को सही तरीके से प्राप्त करने के लिए पूर्वनिर्धारित राउंड () फ़ंक्शन का उपयोग कर रहे हैं।