ऐसा क्यों है कि parseInt (8,3) == NaN और parseInt (16,3) == 1?


191

मैं पढ़ रहा हूँ इस लेकिन मैं क्या में लिखा है से उलझन में हूँ एक मूलांक तर्क के साथ parseInt अध्याय

parseInt की तालिका (_, 3) परिणाम

ऐसा क्यों है कि parseInt(8, 3)NaNऔर parseInt(16, 3)1?

AFAIK 8 और 16 बेस -3 नंबर नहीं हैं, इसलिए parseInt(16, 3)वापस NaNभी आना चाहिए

पहले दस आधार -3 प्राकृतिक संख्या


4
अभी तक एक और मुद्दा जो स्थैतिक टाइपिंग द्वारा हल किया गया है (या कम से कम स्पष्ट रूप से पूर्णांक को स्ट्रिंग में परिवर्तित नहीं करना है): P
नवीन

4
@Navin इसका स्टैटिक बनाम डायनामिक टाइपिंग से कोई लेना-देना नहीं है (जैसा कि आप खुद को नोट करते हैं)। मजबूत टाइपिंग के विपरीत यहां की समस्या कमजोर है।
स्वेन मार्नाच

12
जब मैंने इस प्रश्न का शीर्षक देखा तो मैंने अपने आप से सोचा, "यह शायद इसलिए है क्योंकि लोलजवस्क्रिप्ट"। उत्तर देखकर कि मैं अपनी वृत्ति को मूल रूप से सही मानता हूं।
बेन मिलवुड

जवाबों:


373

यह कुछ लोग हैं जो हर समय यात्रा करते हैं, तब भी जब वे इसके बारे में जानते हैं। :-) आप इसे उसी कारण से देख रहे हैं जो parseInt("1abc")1: parseIntपहले अमान्य वर्ण पर रुकता है और उस बिंदु पर जो कुछ भी है उसे वापस करता है। यदि पार्स करने के लिए कोई मान्य वर्ण नहीं हैं, तो यह वापस आ जाता है NaN

parseInt(8, 3)" "8"बेस 3 में पार्स" का अर्थ है (ध्यान दें कि यह संख्या 8को एक स्ट्रिंग में बदल देता है ; कल्पना में विवरण )। लेकिन आधार 3 में, एकल अंकों की संख्या बस कर रहे हैं 0, 1और 2। यह "9"अष्टक में पार्स करने के लिए कहने जैसा है । चूँकि कोई मान्य वर्ण नहीं था, इसलिए आपको मिला NaN

parseInt(16, 3)इसे "16"आधार में पार्स करने के लिए कह रहा है 3. चूंकि यह पार्स कर सकता है 1, यह करता है, और फिर इसे रोक देता है 6क्योंकि यह इसे पार्स नहीं कर सकता है। तो लौट आता है 1


चूँकि इस प्रश्न पर बहुत अधिक ध्यान दिया जा रहा है और खोज परिणामों में अत्यधिक रैंक हो सकता है, यहाँ जावास्क्रिप्ट में संख्याओं के लिए स्ट्रिंग बदलने के लिए विकल्पों का एक समूह है, अपने विभिन्न आइडिओसिंकरेसीज़ और अनुप्रयोगों के साथ (SO पर यहाँ मेरा एक और उत्तर से उठा):

  • parseInt(str[, radix])- स्ट्रिंग की शुरुआत के रूप में ज्यादा के रूप में यह अंत में अतिरिक्त वर्णों की अनदेखी, एक पूर्ण (पूर्णांक) संख्या में बदल सकते हैं। तो parseInt("10x")है 10; xनजरअंदाज कर दिया है। , एक वैकल्पिक मूलांक (संख्या आधार) तर्क का समर्थन करता है तो parseInt("15", 16)है 21( 15हेक्स में)। यदि कोई मूलांक नहीं है, तो दशमलव को मानता है जब तक कि स्ट्रिंग 0x(या 0X) के साथ शुरू नहीं होती है , उस स्थिति में यह उन लोगों को छोड़ देता है और हेक्स मान लेता है। (कुछ ब्राउज़रों ने 0अष्टक के रूप में शुरू होने वाले तार का इलाज किया ; वह व्यवहार कभी भी निर्दिष्ट नहीं किया गया था, औरNaN ES5 विनिर्देश में विशेष रूप से अस्वीकृत हो गया था ।) कोई भी पारगम्य अंक नहीं मिलने पर वापस लौटता है।

  • parseFloat(str)- जैसे parseInt, लेकिन फ़्लोटिंग-पॉइंट नंबर और केवल दशमलव का समर्थन करता है। फिर स्ट्रिंग पर अतिरिक्त वर्ण अनदेखी कर रहे हैं, इसलिए parseFloat("10.5x")है 10.5( xनजरअंदाज कर दिया है)। केवल दशमलव के रूप में समर्थित है, parseFloat("0x15")है 0(कम से समाप्त होता है को पार्स क्योंकि x)। NaNयदि कोई पार्स करने योग्य अंक नहीं मिलते हैं, तो लौटाता है।

  • Unary +, उदा +str- (जैसे, निहित रूपांतरण) पूरे स्ट्रिंग को फ़्लोटिंग पॉइंट और जावास्क्रिप्ट के मानक संख्या अंकन (सिर्फ अंक और एक दशमलव बिंदु = दशमलव; 0xउपसर्ग = हेक्स; 0oउपसर्ग = ओक्टल [ES2015 +] का उपयोग करके एक संख्या में परिवर्तित करता है ; कुछ कार्यान्वयन इसे विस्तारित करते हैं ; 0अष्टक के रूप में एक अग्रणी का इलाज करने के लिए , लेकिन सख्त मोड में नहीं)। +"10x"है NaNक्योंकि xहै नहीं नजरअंदाज कर दिया। +"10"है 10, +"10.5"है 10.5, +"0x15"है 21, +"0o10"है 8[ES2015 +]। एक पकड़ है: +""जैसा कि आप उम्मीद 0नहीं NaNकर सकते हैं।

  • Number(str)- बिल्कुल अंतर्निहित रूपांतरण (जैसे, +ऊपर की एकता की तरह ), लेकिन कुछ कार्यान्वयन पर धीमा। (ऐसा नहीं है कि यह मामला होने की संभावना है।)


8
तो parseIntपहले toStringतर्क पर पहले उपयोग करता है? यह समझ में आता है।
evolutionxbox

16
@evolutionxbox: हाँ, यह parseIntएल्गोरिथम का पहला चरण है : ecma-international.org/ecma-262/7.0/…
TJ Crowder

5
मुझे लगता 123e-2है कि 1यह 1.23पहली बार में बदल जाता है और तब दशमलव बिंदु पर रुक जाता है?
ilkachachu

6
"यह कुछ लोग हैं जो हर समय यात्रा करते हैं, यहां तक ​​कि जब वे इसके बारे में जानते हैं" -> क्या मैं केवल एक ही हूं जो सोचता है कि यह एक बग होना चाहिए? उदाहरण के लिए जावा में एक ही करना आपको NumberFormatExceptionहर बार देगा।
विम डेब्लाउवे

4
@SvenMarnach: का वह हिस्सा parseInt(स्ट्रिंग के लिए पहला तर्क जोर देना) समझ में आता है। के प्रयोजन parseIntहै पार्स एक पूर्ण संख्या के लिए एक स्ट्रिंग। इसलिए यदि आप इसे कुछ ऐसा देते हैं जो एक स्ट्रिंग नहीं है, तो स्ट्रिंग प्रतिनिधित्व प्राप्त करना समझ में आता है। इसके बाद जो करता है वह एक पूरी 'नॉट स्टोरी' है ...
टीजे क्राउडर

54

उसी कारण से

>> parseInt('1foobar',3)
<- 1

में दस्तावेज़ , parseIntएक स्ट्रिंग लेता है। तथा

यदि स्ट्रिंग एक स्ट्रिंग नहीं है, तो इसे स्ट्रिंग में बदल दिया जाता है

तो 16, 8या '1foobar'पहले स्ट्रिंग में परिवर्तित किया जाता है।

फिर

यदि parseIntएक ऐसे चरित्र से सामना होता है जो निर्दिष्ट मूलांक में एक अंक नहीं है, तो वह इसे और सभी सफल पात्रों को अनदेखा करता है

मतलब यह जहां तक ​​हो सके वहां तक ​​पहुंचाता है। 6, 8, और foobarध्यान नहीं दिया जाता है, और केवल क्या से पहले बदल जाती है है। अगर कुछ नहीं है, NaNतो लौटा दिया जाता है।


0
/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]

parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]

parseInt(2, 3); // 2   - yes we can !

parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]

parseInt(16, 3); // 1  
//'16' => '1' (6 ignored because it not in [0,1,2])    

/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/ 
parseInt('FOX9', 16); // 15  
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]

कुछ और उदाहरण:

parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]

parseInt('1011', 2); // 11 (decimal NOT binary)

parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]

parseInt(786,8); // 7 
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])

parseInt(76,8); // 62 
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.