2009-10-31 15 views
7

sqrt का आउटपुट PHP में "16" के लिए पूर्णांक क्यों नहीं है?PHP में स्क्वायर रूट

उदाहरण

php > $fig = 16; 
php > $sq = sqrt($fig); //should be 4 
php > echo $sq; 
4 
php > echo is_int($sq);   // should give 1, but gives false 
php > 

मुझे लगता है कि समस्या आंतरिक प्रस्तुति जो पीएचपी अजगर के रूप में इसी तरह छुपाता है। तब आप कैसे जान सकते हैं कि स्क्वायर रूट लेने के बाद दिया गया चित्र पूर्णांक कब होता है?

तो आप रेगेक्स का उपयोग किये बिना PHP में 4 और 4.12323 के बीच अंतर कैसे कर सकते हैं?

उत्तर

15

PHP मैनुअल के अनुसार, float sqrt (float $arg), sqrt() हमेशा एक फ्लोट देता है। Is_int() फ़ंक्शन का उपयोग समस्या को हल नहीं करेगा क्योंकि यह डेटाटाइप की जांच करता है और विफलता देता है।

इस के आसपास पाने के लिए, तो आप इसके बजाय मापांक का उपयोग करके परीक्षण कर सकते हैं: आप PHP 5.2 उपयोग कर रहे हैं (() fmod होना चाहिए चल बिन्दु मापांक और नहीं पूर्णांक मापांक के लिए% ऑपरेटर के लिए)

if (fmod(sqrt(16), 1) == 0) { 
    // is an integer 
} 

.0 या बाद में, मेरा मानना ​​है कि यह भी काम करेगा, लेकिन मैं परिस्थिति के इस प्रकार में उपयोग नहीं किया है निश्चित होने के लिए:

$result = sqrt(16); 
if (filter_var($result, FILTER_VALIDATE_INT)) { 
    // is an integer 
} 
+0

आपका पहला आदेश मेरे लिए काम नहीं कर रहा है, लेकिन अंतिम काम करता है। –

+0

आप सही हैं। पहला भी अब काम करता है। मैंने संपादन पोस्ट करने से पहले इसे दोबारा जांच लिया। – Jason

+0

एक साइड नोट के रूप में, (फ्लोट% 1) का उपयोग करके एक पूर्णांक के लिए परीक्षण जावास्क्रिप्ट और MySQL में काम करता है, बस PHP में नहीं, जिसके लिए% की बजाय fmod() की आवश्यकता होती है। – Jason

2

क्योंकि यह हमेशा एक नाव रिटर्न:

float sqrt(float $arg) 

आप एक पूर्णांक में डाल सकता अगर आप चाहते हैं:

intval(sqrt(16)); 

संपादित करें, ठीक है तो:

$sqrt = sqrt(16); 

if (strpos($sqrt, '.') !== false) 
{ 
    $sqrt = intval($sqrt); 
} 

else 
{ 
    $sqrt = floatval($sqrt); 
} 

var_dump($sqrt); 
+1

'अंतराल' के साथ समस्या यह है कि यह गोल हो जाती है। मुझे यह जानने की ज़रूरत है कि एक पूर्णांक कौन सा वर्ग रूट लेने के बाद नहीं है। –

5

एपीआई में सही कहता है, रिटर्न टाइप फ्लोट है।

http://us2.php.net/sqrt

float sqrt (float $arg ) 

आर्ग का वर्गमूल देता है।

3

आप मूल्य के पूर्णांक भाग प्राप्त करने के लिए मंजिल समारोह का उपयोग कर सकते हैं और मूल मूल्य घटाएं। यदि अंतर है! = 0 तो यह एक पूर्णांक नहीं है। जैसे

if (($sq - floor($sq)) == 0){ 
    YES 
}else{ 
NO 
} 
+1

यह भी एक अच्छी विधि है। Knuth के कार्य को इंगित करने के लिए धन्यवाद! –

0

पूर्णांकों के लिए जाँच करने के लिए एक और तरीका है एक स्ट्रिंग के लिए कास्टिंग की जाएगी और यह जांच करना कि ctype_digit()

$result = sqrt(16); 
if (ctype_digit((string)$result)) { 
    // is an integer 
} 

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

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