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 कंडीशन के बजाय else कंडीशन निष्पादित होती है, भले ही $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
व्याख्या:
यहां हम दो फ्लोटिंग पॉइंट वेरिएबल्स val1 और val2 के साथ epsilon का उपयोग कर रहे हैं। फिर हम नेटिव फंक्शन abs() का उपयोग करके वेरिएबल्स (val1 और val2) का निरपेक्ष अंतर लेते हैं। यह कोड हमें निरपेक्ष मान देगा लेकिन सवाल यह है कि हम निरपेक्ष मान क्यों ले रहे हैं? उत्तर है हम देख सकते हैं कि दोनों मानों में दशमलव के बाद 5 तक समान अंक हैं, जिसका विश्लेषण PHP के लिए कठिन है।
केस 2:
round() फंक्शन का उपयोग।
<?php
$val1 = 9 - 6.2;
$val2 = 1.8;
var_dump(round($val1, 2) == round($val2, 2));
?>
आउटपुट:
bool(true)
व्याख्या:
यहां हम दो फ्लोटिंग पॉइंट वेरिएबल्स val1 और val2 का उपयोग कर रहे हैं। फिर हम पूर्वनिर्धारित फंक्शन round() का उपयोग कर रहे हैं जो फ्लोटिंग वैल्यूज़ को दो दशमलव स्थानों तक राउंड ऑफ करता है और फिर उनकी तुलना करता है। यहां हम अपने अपेक्षित परिणाम को सही तरीके से प्राप्त करने के लिए पूर्वनिर्धारित round() फंक्शन का उपयोग कर रहे हैं।