ParseInt (1/0, 19) 18 क्यों लौटता है?


853

मुझे जावास्क्रिप्ट में एक कष्टप्रद समस्या है ।

> parseInt(1 / 0, 19)
> 18

parseIntफ़ंक्शन वापस क्यों आता है 18?


3
दिलचस्प। लेकिन आपके लिए यह कष्टप्रद समस्या क्यों है? क्या आपको अन्य तरीकों से इन्फिनिटी को संभालना है? यदि हां, तो एक ifमदद कर सकता है।
थिलो

254
क्या नरक तुम भी कर रहे थे कि आप या तो आधार -19 नंबर या शून्य से विभाजन के साथ काम करने की आवश्यकता है !?
जैक एम।

19
जब आप जेएस के बारे में भ्रमित हो जाते हैं, तो बस इस उद्धरण पर वापस जाएं और याद रखें कि पूरे लानत भाषा को 10 दिनों से कम समय में डिजाइन किया गया था और इसे लागू किया गया था (उस व्यक्ति के अनुसार जिसने इसे किया था)।
tylerl

32
एफएक्यू से: "आपको वास्तविक समस्याओं के आधार पर केवल व्यावहारिक, उत्तर देने योग्य प्रश्न पूछने चाहिए।" यह वास्तव में एक "कष्टप्रद समस्या" नहीं है जिसका आप वास्तव में सामना करते हैं, यह एक अवास्तविक उदाहरण है जो हमेशा के लिए इंटरनेट पर तैर रहा है
जेरेमी बैंक्स

2
अजगर एक ही काम करता है: int ('I', 19) == 18
oberhamsi

जवाबों:


1292

का नतीजा 1/0है Infinity

parseIntअपने पहले तर्क को एक स्ट्रिंग के रूप में मानता है जिसका अर्थ है कि सबसे पहले Infinity.toString()स्ट्रिंग का उत्पादन किया जाता है "Infinity"। तो यह उसी तरह काम करता है जैसे आपने इसे "Infinity"बेस 19 में दशमलव में बदलने के लिए कहा था ।

यहाँ उनके दशमलव मानों के साथ आधार 19 में अंक हैं:

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

आगे क्या होता है कि parseIntइनपुट "Infinity"को यह पता लगाने के लिए स्कैन किया जाता है कि इसके किस भाग को पार्स किया जा सकता है और पहले स्वीकार करने के बाद बंद हो जाता है I(क्योंकि nआधार 19 में मान्य अंक नहीं है)।

इसलिए यह इस तरह व्यवहार करता है जैसे कि आप कहते हैं parseInt("I", 19), जो ऊपर दी गई तालिका द्वारा दशमलव 18 में बदल जाता है।


32
@mithunsatheesh प्रयास करें parseInt('Infini',24)
सुप्र

112
@mithunsatheesh: क्योंकि आधार 24 nमें भी एक वैध अंक है, इसलिए यह वास्तव में करना समाप्त कर देता है parseInt("Infini", 24)
जॉन

36
कोई किसी भाषा में ves प्रोग्राम ’क्यों करना चाहता है जो इस तरह का व्यवहार करता है, वह मुझसे परे है।
फ्रान्स बोमा

45
@FransBouma: JS अपने तरीके से सुंदर है। और वास्तव में, यहां जो भी होता है उसका कोई भी हिस्सा एक गतिशील भाषा में अनुचित नहीं है।
जॉन

59
@Jon: यह विरूपण साक्ष्य गतिशील भाषा का परिणाम नहीं है; यह ढीली-टाइपिंग का परिणाम है। कड़ाई से टाइप की हुई डायनेमिक भाषा में, इन्फिनिटी (फ्लोट) के "इनफिनिटी" (स्ट्रिंग) के निहित रूपांतरण इस तरह की खटास को रोकने के लिए नहीं होगा।
रयान

225

यहाँ घटनाओं का क्रम है:

  • 1/0 का मूल्यांकन करता है Infinity
  • parseIntपढ़ता है Infinityऔर खुशी से नोट करता Iहै कि बेस 19 में 18 है
  • parseInt स्ट्रिंग के शेष को अनदेखा करता है, क्योंकि इसे परिवर्तित नहीं किया जा सकता है।

ध्यान दें कि आपको किसी भी आधार के लिए परिणाम मिलेगा >= 19, लेकिन उसके नीचे के आधारों के लिए नहीं। ठिकानों के लिए >= 24, आपको एक बड़ा परिणाम मिलेगा, क्योंकि nउस बिंदु पर एक वैध अंक बन जाता है।


@ थिलेटो बीटीडब्लू, क्या कारण होगा , अगर आधार के अधिक होने पर यह 19 पर क्यों रुक सकता है ? क्या आप जानते हैं, जेएस सबसे बड़ा आधार क्या हो सकता है?
अर्नथोर

4
@Nordvind सबसे बड़ा आधार parseIntस्वीकार करेगा 36, क्योंकि अंग्रेजी वर्णमाला में 26 अक्षर हैं, और कन्वेंशन अंकों का उपयोग करना है तो दिए गए आधार में मान्य अंकों के सेट के रूप में पत्र।
क्रेग सिट्रो

4
बुलेट पॉइंट # 2 पर, क्या मैं इसे बदलने Infinityका सुझाव दे सकता हूं "Infinity"...
CJBS

38

उपरोक्त उत्तरों को जोड़ने के लिए:

parseInt को स्ट्रिंग्स को संख्याओं में पार्स करने का इरादा है (सुराग नाम में है)। आपकी स्थिति में, आप कोई भी पार्सिंग नहीं करना चाहते हैं क्योंकि 1/0 पहले से ही एक नंबर है, इसलिए यह फ़ंक्शन का एक अजीब विकल्प है। यदि आपके पास एक संख्या है (जो आप करते हैं) और इसे एक विशेष आधार में बदलना चाहते हैं, तो आपको इसके बजाय एक मूलांक के साथ स्ट्रिंग का उपयोग करना चाहिए ।

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

13

उपरोक्त उत्तरों को जोड़ने के लिए

parseInt(1/0,19) के बराबर है parseInt("Infinity",19)

आधार 19 नंबरों के भीतर 0-9और A-I (or a-i)एक वैध संख्या हैं। तो, "इन्फिनिटी" से यह Iबेस 19 का हो जाता है और बेस 10 में परिवर्तित हो जाता है, जो 18 हो जाता है, फिर यह अगले वर्ण को लेने की कोशिश करता है, nजो बेस 19 में मौजूद नहीं है, इसलिए अगले वर्णों के अनुसार (नंबर के स्ट्रिंग बदलने के लिए जावास्क्रिप्ट के व्यवहार के अनुसार) )

इसलिए, यदि आप लिखना parseInt("Infinity",19)या parseInt("I",19)या parseInt("i",19)परिणाम एक ही यानी हो जाएगा 18

अब, अगर आप लिखना parseInt("I0",19)परिणाम होगा 342 के रूप में I X 19 (the base)^1 + 0 X 19^0 = 18 X 19^1 + 0 X 19^0= 18 X 19 + 0 X 1 =342

इसी तरह, parseInt("I11",19)में परिणाम होगा6518

अर्थात

  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.