2012-09-26 15 views
101

संभव डुप्लिकेट होने के लिए:
php == vs === operator
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?पीएचपी दो अलग तार को व्यक्त करता है एक ही

क्यों बयान वापसी true निम्नलिखित है?

"608E-4234" == "272E-3063" 

मैंने स्ट्रिंग के चारों ओर एकल उद्धरण के साथ भी यह कोशिश की है। एक ही रास्ता मैं इसे false को evaulate को प्राप्त कर सकते हैं ==

मेरा अनुमान पीएचपी समीकरण के कुछ प्रकार के रूप में यह इलाज है, लेकिन यह एक अजीब एक का एक सा लगता है के बजाय === ऑपरेटर का उपयोग कर रहा है।

क्या कोई विस्तृत कर सकता है?

+5

echo 608E-4234 = 0; गूंज 272 ई -3063 = 0; 0 == 0 –

+3

http://php.net/strcmp क्या कहता है? – Bokw

+14

[PHP कमजोर/ढीला टाइप किया गया है] (http://stackoverflow.com/questions/467871/what-is-a-loosely-typed-language)। संदर्भ के आधार पर, आप जो दावा करते हैं वह एक स्ट्रिंग है, वास्तव में कुछ और है। यदि आप तारों की तुलना करना चाहते हैं तो बेहतर = '== 'का उपयोग करें। अपने ऑपरेटरों को जानें। – hakre

उत्तर

107

"608E-4234"float number format है, इसलिए वे तुलना करते समय संख्या में डाल देंगे।

608E-4234 और 272E-3063 दोनों float(0) होंगे क्योंकि वे बहुत छोटे हैं।

php में == के लिए,

आप एक तार के साथ एक संख्या की तुलना या तुलना संख्यात्मक तार शामिल है, तो प्रत्येक स्ट्रिंग एक नंबर में बदल जाती है और तुलना संख्यानुसार प्रदर्शन किया।

http://php.net/manual/en/language.operators.comparison.php

ध्यान दें:

क्या जावास्क्रिप्ट में व्यवहार जो भी दोनों == और === है के बारे में?

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

जावास्क्रिप्ट में:

608E-4234 == 272E-3063 // true 
608E-4234 == "272E-3063" // true 
"608E-4234" == 272E-3063 // true 
"608E-4234" == "272E-3063" // false (Note: this is different form PHP) 

तो जावास्क्रिप्ट में, जब आप परिणाम के प्रकार पता है, तुम === के बजाय == इस्तेमाल कर सकते हैं एक चरित्र को बचाने के लिए।

उदाहरण के लिए, typeof ऑपरेटर हमेशा एक स्ट्रिंग देता है, तो आप सिर्फ कोई नुकसान के साथ

बजाय typeof foo == 'string'typeof foo === 'string' इस्तेमाल कर सकते हैं।

+4

मैनुअल से [ऑपरेटर तुलना] के बारे में महत्वपूर्ण बिट (http://php.net/manual/en/language.operators.comparison.php): * यदि आप किसी स्ट्रिंग के साथ किसी संख्या की तुलना करते हैं ** या तुलना में संख्यात्मक तार शामिल हैं **, तो प्रत्येक स्ट्रिंग को एक संख्या में परिवर्तित किया जाता है और तुलनात्मक रूप से निष्पादित की जाती है। * –

+26

यह भी देखें: http://phpsadness.com/sad/47 – nickgrim

+5

'न्यूमेरिकल स्ट्रिंग्स '-> [क्या।] (http: // tvtropes .org/pmwiki/pmwiki.php/मुख्य/FlatWhat) क्या यह PHP में सुरक्षित अनुप्रयोगों को लिखना मुश्किल नहीं है। –

5

मैं उत्तर देने का प्रयास कर रहा हूं। यदि आप "===" का उपयोग कर रहे हैं, तो आप मूल्य के बजाय प्रकार के साथ भी जांचते हैं। यदि आप "==" का उपयोग कर रहे हैं, तो आप केवल जांच करें कि मान समान है या नहीं।

आप here और here पर संदर्भित कर सकते हैं।

10

पीएचपी चल बिन्दु संख्या के रूप में उन तार तुलना कर रहा है, और वे दोनों शून्य कर रहे हैं, ताकि आप MUST=== ऑपरेटर का उपयोग,

+2

जैसा कि मैंने अपने उत्तर में कहा था, ऐसा इसलिए है क्योंकि दो तारों की तुलना फ्लोटिंग पॉइंट संख्याओं के रूप में की जाती है, जो शून्य तक गोल होते हैं, इसलिए वे ** बराबर ** हैं लेकिन नहीं ** समान ** –

20

पीएचपी तैरता के लिए आईईईई 754 का उपयोग करता है, और अपने नंबर इतना छोटा है कि वे evalue 0 पर

देखें: http://en.wikipedia.org/wiki/IEEE_floating_point

Name  Common name   Base Digits E min E max 
binary32 Single precision  2 23+1 −126 +127   
binary64 Double precision  2 52+1 −1022 +1023  
+2

लेकिन वह फ्लोट की तुलना नहीं कर रहा था, वह तारों की तुलना कर रहा है। तो फ्लोट्स ** के लिए PHP का उपयोग क्या करना चाहिए ** ** अप्रासंगिक होना चाहिए – jalf

+2

@jalf php को कम से कम टाइप किया गया है और दृश्यों के पीछे मूल्यों को परिवर्तित कर रहा है == बुरा है यदि आप भाषा से परिचित नहीं हैं, अगर वह उन्हें आवश्यक तारों के रूप में तुलना करना चाहता था === या strcmp का उपयोग करने के लिए दूसरों ने उल्लेख किया है। – stoj

+7

@stoj yes, लेकिन मेरा मुद्दा यह है कि यह उत्तर प्रश्न का उत्तर नहीं देता है: यह PHP द्वारा उपयोग किए गए एफपी प्रतिनिधित्व का वर्णन करता है, लेकिन यह महत्वपूर्ण तथ्य नहीं बताता है कि "यदि आपकी स्ट्रिंग एक एफपी मान की तरह दिखती है, तो इसे परिवर्तित कर दिया जाएगा एक एफपी मूल्य में "। – jalf

13

मुझे लगता है कि पीएचपी एक वैज्ञानिक वाक्य रचना है, जो अनुवाद किया जाएगा के रूप में इस पढ़ता है कि के रूप में:

608 x 10^-4234 == 272 x 10^-3063 

PHP इसे 0 = 0 के रूप में व्याख्या करता है।

3

यह यह क्या देख रहा है है:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=
http://www.wolframalpha.com/input/?i=272E-3063

के रूप में वे चर में फिट नहीं बैठते, वे दोनों 0 के लिए समानता, या डिफ़ॉल्ट जो कुछ भी मूल्य php चुनता है, और इसलिए बराबर हैं।

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