Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. PHP
Code

PHP इंटीजर्स, फ्लोट्स, और नंबर स्ट्रिंग्स

by
Difficulty:BeginnerLength:MediumLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

PHP में नंबर्स के साथ काम करना एक छोटा कांसेप्ट प्रतीत होता है, लेकिन यह काफी उलझन भरा हो सकता है। यह पहली बार आसान लगता है क्योंकि PHP आटोमेटिक टाइप कन्वर्जेन प्रदान करता है। उदाहरण के लिए, आप एक वेरिएबल के लिए एक इन्टिजर वैल्यू असाइन कर सकते हैं, और उस वेरिएबल का टाइप एक इन्टिजर होगा। अगली लाइन पर, आप एक ही वेरिएबल के लिए एक स्ट्रिंग असाइन कर सकते हैं, और टाइप एक स्ट्रिंग में बदल जाएगा। दुर्भाग्यवश, यह आटोमेटिक कन्वर्जेन कभी-कभी आपके कोड को ब्रेक कर सकता है।

न्यूमेरिक वैल्यूज के लिए भी बहुत सारे टाइप हैं। इस ट्यूटोरियल में, आप PHP में इन्टिजर और फ्लोट्स के साथ-साथ उन फंक्शन्स के बारे में भी जानेंगे जिनका उपयोग हम उन नंबर्स के टाइप को निर्धारित करने के लिए कर सकते हैं जिनके साथ हम काम कर रहे हैं और उनके बीच कन्वर्जेन होते हैं। आप यह भी सीखेंगे कि न्यूमेरिक स्ट्रिंग्स को और से इन्टिजर और फ़्लोट में कैसे परिवर्तित करें।

PHP में नंबर के विभिन्न टाइप

इंटीजर्स

PHP में सबसे बेसिक टाइप का नंबर एक इन्टिजर होता है। जैसा कि आप पहले से ही जानते हैं, इन्टिजर डेसीमल पार्ट के बिना एक नंबर हैं। उदाहरण के लिए, 2 एक इन्टिजर है, और इसलिए 235298 या -235298 भी है। दूसरी ओर, 2.0 और 3.58 फ्लोट हैं। हम बाद में इसके बारे में अधिक विस्तार से चर्चा करेंगे।

याद रखने की एक महत्वपूर्ण बात यह है कि यह आवश्यक नहीं है कि एक नंबर टाइप int ही हो यदि उसके पास दशमलव भाग नहीं है। उदाहरण के लिए, 16 * 2.5 पूरा पूरा 40 होता है, लेकिन इस परिणाम का टाइप अभी भी एक float होगा। जब आप नंबर्स को गुणा कर रहे होते हैं, तो अंतिम परिणाम टाइप फ्लोट होगा यदि कम से कम एक ऑपरेंड फ्लोट हो। इससे कोई फर्क नहीं पड़ता कि अंतिम नंबर का दशमलव भाग है या नहीं।

साथ ही, आपके सिस्टम पर PHP में एक इन्टिजर की अधिकतम संभव वैल्यू कांस्टेंट PHP_INT_MAX का उपयोग करके प्राप्त की जा सकती है। PHP_INT_MAX द्वारा दी गयी वैल्यू की तुलना में परिमाण में अधिक वैल्यू एक फ्लोट के रूप में स्टोर की जायेगी, भले ही यह एक इन्टिजर की तरह दिखती हो।

आम तौर पर, आप टाइप int और int के दो वेरिएबल के गुणा के परिणाम की अपेक्षा करेंगे। हालांकि, यह एक ओवरफ्लो के मामले में सच नहीं है। पांच या छह अलग-अलग नंबर्स के गुणा से आप आसानी से int टाइप की बाउंड के बाहर ले जा सकते हैं। उदाहरण के लिए, 128*309*32*43*309 का परिणाम मेरे सिस्टम पर एक फ्लोट है क्योंकि यह PHP_INT_MAX की वैल्यू से अधिक है, जो 2147483647 है।

आप is_int($value) फ़ंक्शन का उपयोग यह जांचने के लिए कर सकते हैं कि कोई नंबर इन्टिजर टाइप है या नहीं। इस फ़ंक्शन के दो उपनाम हैं, जिन्हें is_integer($value) और is_long($value) कहा जाता है। वे दोनों एक ही परिणाम देंगे।

फ्लोट्स

अगला सबसे आम टाइप जिस नंबर से आप निपटेंगे, वह एक फ्लोट है। इन्टिजर के विपरीत, जो कि अधिकांश मामलों में दशमलव बिंदुओं के बिना बस नंबर्स था, कई टाइप के float को विभिन्न तरीकों से प्रदर्शित किया जा सकता है। वैल्यू 3.14, 12.0, 5.87E+10, और 3.56E-5 सभी फ्लोट हैं।

जब भी डेसीमल या बहुत बड़ा नंबर शामिल हो PHP आटोमेटिक रूप से नंबर को float टाइप में परिवर्तित कर देगा। float टाइप आमतौर पर नंबर्स को लगभग 1.7976931348623E+308 के बराबर मात्रा के साथ स्टोर कर सकता है। हालांकि, यह प्लेटफार्म पर निर्भर है।

वैल्यू 1.7976931348623E+308 एक बहुत बड़ी वैल्यू की तरह प्रतीत हो सकती है-और यह है भी! -लेकिन फ्लोट्स में केवल 14 अंकों की अधिकतम सटीकता होती है। इससे अधिक अंक वाले किसी भी नंबर की सटीकता कम हो जाएगी। इसका मतलब है कि आप एक बहुत बड़ा नंबर स्टोर कर सकते हैं, लेकिन आप अपनी सटीक वैल्यू के बारे में जानकारी रखने में सक्षम नहीं होंगे-कई मामलों में, एक फ्लोट केवल एक अनुमान है।

ऐसे दो फंक्शन हैं जिनका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि आप जिस वैल्यू से निपट रहे हैं वह एक फ्लोट है। ये फ़ंक्शन is_float() हैं और is_double() हैं। असल में, is_double() is_float() का एक उपनाम है, इसलिए आप उनमें से किसी एक का उपयोग कर सकते हैं और एक ही परिणाम प्राप्त कर सकते हैं।

इंफिनिटी और NaN

गणित से संबंधित प्रोग्राम लिखते समय आपके पास दो और टाइप की न्यूमेरिक वैल्यू हैं जिनसे आपको डील करनी पड़ सकती है। ये वैल्यू इंफिनिटी हैं और NaN (not a number) है। इन दोनों वैल्यूज को थोड़ा स्पष्टीकरण की आवश्यकता होती है क्योंकि वे आपकी अपेक्षा से अलग होती हैं।

PHP में इंफिनिटी वास्तविक जीवन की इंफिनिटी से अलग है। PHP में, किसी प्लेटफ़ॉर्म पर लगभग PHP_FLOAT_MAX से ऊपर के किसी भी न्यूमेरिक वैल्यू की इंफिनिटी माना जाता है। तो 1.8e308 आपको var_dump() पर float(INF) देगा। आप is_finite() और is_infinite() फ़ंक्शंस का उपयोग करके चेक कर सकते हैं की क्या न्यूमेरिक वैल्यू फिनिट है या इनफिनिट है।

इसी तरह, NaN Not a Number के लिए स्टैंड करता है, लेकिन यह जांच नहीं करता है कि कोई वैल्यू न्यूमेरिक है या नहीं। वैल्यू NaN का उपयोग गणितीय ऑपरेशन के परिणामस्वरूप किया जाता है जो गणित में संभव नहीं है। उदाहरण के लिए, log(-1) NaN होगा। इसी तरह, acos(5) भी NaN होगा। आप जांच सकते हैं कि गणितीय ऑपरेशन द्वारा रीटर्न की गयी वैल्यू फ़ंक्शन is_nan() का उपयोग करने पर एक नंबर नहीं है।

PHP में न्यूमेरिक स्ट्रिंग्स

जैसे ही PHP डायनामिक रूप से विभिन्न वैल्यूज के टाइप को बदलता है, उनकी वैल्यूज  का उपयोग या असाइन किए जाने के आधार पर, यह आपके लिए नंबर्स में परिवर्तित करने के लिए विभिन्न न्यूमेरिक स्ट्रिंग्स की वैल्यू का भी अनुमान लगा सकता है।

फ़ंक्शन is_numeric() यह निर्धारित करने में आपकी सहायता कर सकता है कि कोई स्ट्रिंग या वेरिएबल वास्तव में न्यूमेरिक है या नहीं। यह फंक्शन ऑक्टल, बाइनरी, या हेक्साडेसिमल नोटेशन में लिखे गए नंबरों के लिए true होगा। यदि नंबर्स +16.52e39 जैसे एक्सपोनेंशियल नोटेशन में लिखा गया हो तो यह भी true रीटर्न करेगा।

PHP 7.0.0 से शुरू करते समय, जब आप is_numeric() पर स्ट्रिंग पास करते हैं, तो स्ट्रिंग में वैकल्पिक साइन, कुछ डिजिट्स, वैकल्पिक दशमलव और वैकल्पिक एक्सपोनेंशियल भाग होते हैं, तो यह केवल true रीटर्न करते है। इसका मतलब है कि हेक्साडेसिमल या बाइनरी फॉर्मेट में लिखी गई न्यूमेरिक स्ट्रिंग PHP 7.0.0 से बड़े वर्जन में false रीटर्न करेगी।

आवश्यकता होने पर PHP निश्चित रूप से किसी वैलिड न्यूमेरिकल स्ट्रिंग को एक नंबर में अंदर ही अंदर कास्ट करेगा। निम्नलिखित उदाहरणों को इस प्रक्रिया को बेहतर ढंग से समझने में आपकी सहायता करनी चाहिए।

जैसा कि आप देख सकते हैं, सभी वैल्यूज न्यूमेरिक स्ट्रिंग्स को जोड़कर या अन्य ऑपरेशन्स से पहले उनके संबंधित वैल्यूज में परिवर्तित कर दिया गया था। अंत में $num का टाइप इसके अंतिम वैल्यू पर निर्भर करता है।

आखिरी मामले में, हेक्साडेसिमल स्ट्रिंग "0xfedd24" को इसके दशमलव वैल्यू में परिवर्तित नहीं किया गया है क्योंकि PHP 7 इसे वैलिड न्यूमेरिक स्ट्रिंग नहीं मानता है।

स्ट्रिंग्स और फ्लोट्स को इन्टिजर में कास्ट करना

अक्सर यहाँ और वहां, आपको एक टाइप की न्यूमेरिक वैल्यू दूसरे में डालनी होती है। PHP में ऐसा करने के लिए कई टाइप के फ़ंक्शन और तकनीक हैं। अधिकतर समय, कन्वर्शन इम्प्लीसिट होगा, और आपको इसके बारे में चिंता करने की आवश्यकता नहीं होगी। हालांकि, अगर आपको स्पष्ट रूप से कन्वर्शन करना है, तो यहां बताई गयी तकनीकों में निश्चित रूप से मदद मिलेगी।

आप किसी भी वैल्यू को इन्टिजर में बदलने के लिए (int) या (integer) का उपयोग कर सकते हैं। फ्लोट्स के मामले में, वैल्यू हमेशा शून्य की ओर राउंड की जायेगी। स्ट्रिंग्स और फ्लोट्स को इन्टिजर में डालने का एक और तरीका intval() फ़ंक्शन की सहायता से है। दोनों (int) और intval() एक ही तरीके से काम करते हैं।

आपको ध्यान रखना चाहिए कि इन्टिजर में स्ट्रिंग ओवरफ्लो कास्टिंग अंतिम वैल्यू को अधिकतम पेर्मिसिबल इन्टिजर वैल्यू पर सेट करेगा। हालांकि, एक फ्लोट कास्टिंग जिसकी वैल्यू अधिकतम स्वीकार्य इन्टिजर वैल्यू से अधिक है, परिणामस्वरूप -2147483648 और 2147483647 के बीच वैल्यू बढ़ जायेगी!

कुछ स्थितियों में, आपको किसी भी प्रिसिशन (precision) को खोए बिना बहुत बड़े नंबर से निपटने की आवश्यकता हो सकती है। उदाहरण के लिए, * ऑपरेटर का उपयोग करके 987233498349834828 और 3487197512 के गुणा का सटीक परिणाम प्राप्त करना असंभव है। फ्लोट कन्वर्शन के बाद यह आपको 3.4426781992086E+27 देगा। वास्तविक उत्तर की गणना, जो 3442678199208600117812547936 है, को BCMath जैसे लाइब्रेरीज के उपयोग की आवश्यकता होगी। BCMath स्ट्रिंग्स के रूप में नंबर्स को स्टोर करके और मैन्युअल रूप से अंकगणितीय ऑपरेशन्स कर काम करता है। बस याद रखें कि यदि आप BCMath का उपयोग करते हैं, तो आप इन्टिजर और फ्लोट के बजाय स्ट्रिंग्स से निपटेंगे।

कुछ लाइब्रेरीज चाहती हैं कि आप उनके मेथड्स में केवल int टाइप के नंबर्स को पास करें, लेकिन आप अनजाने में उन्हें एक फ्लोट वैल्यू सप्लाई कर सकते हैं। ऐसा इसलिए हो सकता है क्योंकि वैल्यू int की तरह लगती है क्योंकि इसमें दशमलव भाग नहीं है। यह निश्चित रूप से एक एरर में परिणाम देगा यदि लाइब्रेरी is_int() जैसे फ़ंक्शन का उपयोग करती है यह जांचने के लिए कि पास किया गया नंबर इन्टिजर टाइप है या नहीं। ऐसे मामलों में, पहले या तो (int) या intval() का उपयोग करके उस नंबर को int करना हमेशा बुद्धिमानी होती है और फिर इसे लाइब्रेरी के किसी भी फ़ंक्शन या मेथड्स तक पास कर देता है।

जब एक ऐसी स्थिति आती है, तो इसका एक उदाहरण तब होगा जब आप floor(), ceil(), आदि जैसे गणितीय फंक्शन्स से निपट रहे हों। floor() और ceil() हमेशा एक फ्लोट रीटर्न करेंगे, भले ही आप उन्हें एक int पास करें!

इन्टिजर को फ़्लोट करने के साथ एक समस्या यह है कि आप नंबर्स का दशमलव भाग खो देंगे। यह वांछनीय (desirable) हो सकता है या नहीं भी हो सकता है। ऐसे मामलों में, आप floor() जैसे फंक्शन का उपयोग कर सकते हैं और केवल नंबर को int टाइप में डाल सकते हैं यदि इसकी वास्तविक वैल्यू floor() द्वारा रीटर्न की गयी वैल्यू के बराबर हो।

आइए वैल्यू लें कि आपके पास एक लाइब्रेरी है जो आपको आंशिक अंकगणित करने की अनुमति देती है, और यह एक्सेप्शन थ्रो करती है जब आप किसी नंबर को अपने setNumerator() मेथड में पास करते हैं जो टाइप int नहीं है। विभिन्न टाइप के ऑपरेशन एक नंबर को फ्लोट में बदल सकते हैं भले ही यह अभी भी न्यूनतम और अधिकतम सीमा टाइप int के भीतर एक इन्टिजर है। ऊपर दिए गए कोड की तरह कुछ उपयोग करने से आप ऐसे मामलों से आसानी से निपटने में मदद करेंगे।

अंतिम विचार

इस ट्यूटोरियल में विभिन्न तरीकों को शामिल किया गया है जिसमें PHP नंबर को स्टोर करता है और आप यह पता लगा सकते हैं की कोई विशेष टाइप का नंबर है की नहीं। उदाहरण के लिए, आप किसी नंबर के टाइप को निर्धारित करने के लिए is_int() और is_float() जैसे फ़ंक्शंस का उपयोग कर सकते हैं और तदनुसार आगे बढ़ सकते हैं।

जैसा कि आपने ट्यूटोरियल में देखा था, PHP आटोमेटिक टाइप कन्वर्शन का समर्थन करता है। इसका मतलब यह है कि कभी-कभी छोटे इन्टिजर जैसे 5 या 476 को आपकी पता हुए बिना ही फ्लोट के रूप में स्टोर किया जा सकता था। इन नंबर्स का उपयोग उन फंक्शन्स में करना जो केवल int वैल्यू स्वीकार करते हैं, परिणामस्वरूप एक्सेप्शन या एरर हो सकते हैं। हमने सीखा है कि इस समस्या का एक सरल समाधान स्पष्ट रूप से ऐसे नंबर्स को int में कास्ट करना है यदि उनके पास दशमलव भाग नहीं है और उनकी वैल्यू कास्टिंग पर नहीं बदलती हैं।

इस ट्यूटोरियल को पढ़ने के बाद, आपको प्रीडिफाइन फंक्शन्स के साथ विभिन्न टाइप के ऑपरेशन्स का उपयोग करने के बाद किसी नंबर या अंतिम टाइप के परिणाम का निर्धारण करने में सक्षम होना चाहिए और कुछ चेक करने के बाद उन्हें स्पष्ट रूप से किसी विशिष्ट टाइप पर एक्सप्लिसिट कास्ट करना चाहिए।

हमेशा की तरह, यदि आपके कोई प्रश्न या अतिरिक्त टिप्स हैं, तो कमेंट करने के लिए आपका स्वागत है।

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.