टाइपऑन NaN 'नंबर' क्यों देता है?


166

जिज्ञासा के कारण।

यह typeof NaNसंख्या बहुत तार्किक नहीं है । जैसे NaN === NaN- NaN == NaNतैसे या झूठे तरीके से लौटकर। क्या यह जावास्क्रिप्ट की ख़ासियत है, या इसका कोई कारण होगा?

संपादित करें: आपके उत्तर के लिए धन्यवाद। हालांकि यह लोगों के सिर पर चढ़ना आसान बात नहीं है। जवाब पढ़ना और विकि मैं अधिक समझा, लेकिन फिर भी, एक वाक्य जैसा

एक NaN के साथ एक तुलना हमेशा खुद के साथ तुलना करने पर भी एक अव्यवस्थित परिणाम देता है। तुलना की भविष्यवाणी या तो सिग्नलिंग या गैर-सिग्नलिंग है, सिग्नलिंग संस्करण ऐसी तुलनाओं के लिए एक अमान्य अपवाद का संकेत देते हैं। समानता और असमानता की भविष्यवाणी गैर-सांकेतिक होती है, इसलिए x = x को गलत लौटाने पर परीक्षण किया जा सकता है यदि x एक शांत एनएन है।

बस मेरा सिर घूमता रहता है। यदि कोई इसे मानव में (जैसा कि, गणितज्ञ के विपरीत,) पठनीय भाषा में अनुवाद कर सकता है, मैं आभारी रहूंगा।


17
+1: "NaN एक संख्या है लेकिन संख्या नहीं है। हम ... क्या?"
ereOn

11
अतिरिक्त मज़ा के लिए; (NaN! == NaN) == सच
एलेक्स के।

1
इससे भी अधिक मजेदार (लेकिन यह समझने में आने वाली समझ है, isNaN एक बूलियन देता है): isNaN (parseInt ('nodice')) === isNaN (parseInt ('someOnNaN')) === true;
KooiInc

1
यदि jQuery का उपयोग करते हैं, तो मैं isNumericइस प्रकार की जांच करना पसंद करता हूं : $.isNumeric(NaN); गलत रिटर्न देता है, जहां $.type(NaN);, रिटर्न नंबर। api.jquery.com/jQuery.isNumeric
जस्टिन

3
पेशेवर गणितज्ञ के रूप में मुझे यह कहना होगा कि गणित की सटीक भाषा के साथ वाक्य में बहुत कम है।
दिमित्री ज़ैतसेव

जवाबों:


53

इसका मतलब Not a Number नहीं है। यह जावास्क्रिप्ट की ख़ासियत नहीं बल्कि सामान्य कंप्यूटर विज्ञान का सिद्धांत है।

से http://en.wikipedia.org/wiki/NaN :

ऑपरेशन के तीन प्रकार हैं जो NaN लौटाते हैं:

कम से कम एक ऑपरेंड के रूप में एक NaN के साथ संचालन

अनिश्चित रूप

  • विभाजन 0/0,, /,, −∞ /,,, /,, और −∞ / /0
  • गुणन 0 × × और 0 × ×
  • शक्ति 1 ^ ∞
  • परिवर्धन add + (−∞), (+) + ∞ और समकक्ष घटाव।

जटिल परिणामों के साथ वास्तविक संचालन:

  • ऋणात्मक संख्या का वर्गमूल
  • एक ऋणात्मक संख्या का लघुगणक
  • 90 डिग्री (या 2/2 रेडियन) के एक से अधिक विषम स्पर्शरेखा
  • एक संख्या का उलटा साइन या कोसाइन जो greater1 से कम या +1 से अधिक है।

ये सभी मूल्य समान नहीं हो सकते हैं। एक NaN के लिए एक सरल परीक्षा value == valueझूठी परीक्षा है।


46
एक और भी सरल परीक्षण हैisNaN(value)
Alsciende

4
@Alsciende हालांकि यह बराबर नहीं है। isNaN(undefined)रिटर्न true, लेकिन undefined == undefinedयह भी सच है। सिवाय अन्य सभी गैर-संख्या प्रकारों के लिए जाता है null
एंडी

7
दूसरे शब्दों में, यह वास्तव में value !== valueपरीक्षण करने का सबसे छोटा तरीका है यदि valueवास्तव में NaN
एंडी

1
ऐसा लगता है कि आप सही हैं, @Andy। अब यह एक ख़ासियत है।
अलसीकेंडे

2
वाक्यांश "ये मूल्य समान नहीं हो सकते हैं" का कोई अर्थ नहीं है, क्योंकि वे मूल्य मौजूद नहीं हैं।
दिमित्री जैतसेव

103

खैर, NaNअभी भी एक संख्यात्मक प्रकार है , इस तथ्य के बावजूद कि यह वास्तव में Not-A-Number :-) के लिए खड़ा है

NaNबस इसका मतलब है कि विशिष्ट मान को संख्यात्मक प्रकार की सीमाओं के भीतर नहीं दिखाया जा सकता है (हालांकि यह सभी संख्याओं के लिए कहा जा सकता है जिन्हें फिट होने के लिए गोल किया जाना है, लेकिन NaNएक विशेष मामला है)।

एक विशिष्ट NaNको दूसरे के बराबर नहीं माना जाता है NaNक्योंकि वे अलग-अलग मूल्य हो सकते हैं। हालांकि, NaNअभी भी एक संख्या प्रकार है, जैसे 2718 या 31415।


आम आदमी की शर्तों में व्याख्या करने के लिए आपके अद्यतन प्रश्न के रूप में:

एक NaN के साथ एक तुलना हमेशा खुद के साथ तुलना करने पर भी एक अव्यवस्थित परिणाम देता है। तुलना की भविष्यवाणी या तो सिग्नलिंग या गैर-सिग्नलिंग है, सिग्नलिंग संस्करण ऐसी तुलनाओं के लिए एक अमान्य अपवाद का संकेत देते हैं। समानता और असमानता की भविष्यवाणी गैर-सांकेतिक होती है, इसलिए x = x को गलत लौटाने पर परीक्षण किया जा सकता है यदि x एक शांत एनएन है।

यह सब साधन है (भागों में टूट गया):

एक NaN के साथ एक तुलना हमेशा खुद के साथ तुलना करने पर भी एक अव्यवस्थित परिणाम देता है।

मूल रूप से, NaNयह किसी भी अन्य संख्या के बराबर नहीं है, जिसमें एक NaNऔर भी शामिल है , और यहां तक ​​कि स्वयं भी शामिल है

तुलना की भविष्यवाणी या तो सिग्नलिंग या गैर-सिग्नलिंग है, सिग्नलिंग संस्करण ऐसी तुलनाओं के लिए एक अमान्य अपवाद का संकेत देते हैं।

एक NaNऔर संख्या के बीच तुलना (तुलना में कम, अधिक और इतने पर) संचालन करने का प्रयास या तो एक अपवाद के रूप में किया जा सकता है (सिग्नलिंग) या केवल परिणाम के रूप में गलत हो रहा है (गैर-सिग्नलिंग या शांत)।

समानता और असमानता की भविष्यवाणी गैर-सांकेतिक होती है, इसलिए x = x को गलत लौटाने पर परीक्षण किया जा सकता है यदि x एक शांत एनएन है।

समानता के लिए टेस्ट (बराबर, बराबर नहीं) कभी भी सिग्नलिंग नहीं होते हैं, इसलिए उनका उपयोग करने से अपवाद नहीं होगा। यदि आपके पास एक नियमित संख्या है x, तो x == xहमेशा सच होगा। यदि xए है NaN, तो x == xहमेशा झूठ होगा। यह आपको NaNआसानी से (चुपचाप) पता लगाने का एक तरीका दे रहा है ।


1
अच्छी व्याख्या, हालांकि मैं पिछले दो वाक्यों से असहमत हूं: यह जांचने का एक बेहतर तरीका है कि क्या x एक NaN है जिसका उपयोग isNaN () फ़ंक्शन
कार्लोस बार्सिलोना

@DominicRodger यहां बताया गया है कि मैं इसके बारे में कैसे सोचता हूं: typeof a === 'number'इसका मतलब है "एक आंतरिक रूप से एक IEEE 754 फ्लोट के रूप में संग्रहीत है"
एंडी

यदि विभिन्न मूल्यों द्वारा निर्मित किया जा सकता है तो Infinity === Infinityवापस क्यों आता है : 1.0 / 0.0 या 2.0 / 0.0? trueInfinity
हशम क़ोलमी

1
@ हशम, काफी संभावना है क्योंकि वे एक ही अनंत माने जाते हैं। विभाजन को बार-बार घटाव के रूप में मानने से कोई फर्क नहीं पड़ता है कि आप दो या एक से शुरू करते हैं, यह एक ही चरण की संख्या है जो पहुँचने के लिए आवश्यक है (या, अधिक सटीक रूप से, पहुंच नहीं ) शून्य। मैं समझता हूँ कि गणित गुरु करना है अनंत के विभिन्न वर्गों लेकिन (1) मुझे लगता है 1/0और 2/0एक ही कक्षा और (2) वहाँ IEEE754 में अनंत का केवल एक ही वर्ग (के अलावा अन्य है में निहित है +/-निश्चित रूप से)।
पाक्सिडाब्लो

1
मुझे इन असाधारण "वास्तविक संख्याओं" को किसी भी सार्थक तरीके से परिभाषित करने के किसी भी तरीके के बारे में पता नहीं है। गणित में लॉग और निगेटिव की जड़ केवल वास्तविक के विस्तार से लेकर जटिल संख्या तक प्राप्त की जा सकती है, जहां वे कई मूल्यों का मूल्यांकन करते हैं, और 0/0इसे किसी भी सार्थक तरीके से परिभाषित नहीं किया जाता है, इसके अलावा इसका "मूल्य" कहने का पूरा सेट है संख्या की। और यहां तक ​​कि अगर वे परिभाषित किए गए थे, तब Math.log(-1) == Math.log(-1)भी मूल्यांकन करता है false। इसलिए न केवल "वास्तविक संख्या" के अलावा अन्य हैं, NaNलेकिन अगर वहाँ भी थे, तो वे तुलना के लिए उपयोग नहीं किए गए थे।
दिमित्री ज़ैतसेव

20

ECMAScript (जावास्क्रिप्ट) मानक निर्दिष्ट करता है कि Numbersकर रहे हैं आईईईई 754 तैरता है, जिसमें शामिल NaNएक संभव मूल्य के रूप में।

ECMA 262 5e खंड 4.3.19 : संख्या मान

डबल-सटीक 64-बिट बाइनरी प्रारूप IEEE 754 मूल्य के अनुरूप आदिम मूल्य।

ECMA 262 5e खंड 4.3.23 : NaN

संख्या मान जो IEEE 754 "Not-a-Number" मान है।

विकिपीडिया पर IEEE 754

फ्लोटिंग-पॉइंट अंकगणित के लिए IEEE मानक इलेक्ट्रिकल और इलेक्ट्रॉनिक्स इंजीनियर्स संस्थान द्वारा स्थापित एक तकनीकी मानक है और फ्लोटिंग-पॉइंट कम्प्यूटेशन के लिए सबसे व्यापक रूप से उपयोग किया जाने वाला मानक [...]

मानक परिभाषित करता है

  • अंकगणितीय प्रारूप : द्विआधारी और दशमलव फ़्लोटिंग-पॉइंट डेटा के सेट, जिसमें परिमित संख्या (हस्ताक्षरित शून्य और उप-असामान्य संख्या सहित), शिशु , और विशेष "एक संख्या नहीं" मान (NaN) शामिल हैं

[...]


8

typeof NaN'number'क्योंकि रिटर्न :

  • ECMAScript युक्ति कहता है कि संख्या प्रकार में NaN शामिल है:

    4.3.20 संख्या प्रकार

    विशेष "Not-a-Number" (NaN) मान, सकारात्मक अनंत और नकारात्मक अनंत सहित सभी संभव संख्या मूल्यों का सेट

  • तो typeofतदनुसार रिटर्न:

    11.4.3 टाइपो ऑपरेटर

    उत्पादन UnaryExpression : typeof UnaryExpression का मूल्यांकन निम्नानुसार किया जाता है:

    1. चलो वैल के मूल्यांकन का परिणाम हो UnaryExpression
    2. यदि टाइप ( वैल ) संदर्भ है , तो
      1. यदि IsUnresolvableReference ( वैल ) है सच , वापसी "undefined"
      2. चलो वैल हो getValue ( वैल )।
    3. लौटें एक स्ट्रिंग द्वारा निर्धारित प्रकार ( वैल तालिका 20 के अनुसार)।

                    Table 20 — typeof Operator Results
    ==================================================================
    |        Type of val         |              Result               |
    ==================================================================
    | Undefined                  | "undefined"                       |
    |----------------------------------------------------------------|
    | Null                       | "object"                          |
    |----------------------------------------------------------------|
    | Boolean                    | "boolean"                         |
    |----------------------------------------------------------------|
    | Number                     | "number"                          |
    |----------------------------------------------------------------|
    | String                     | "string"                          |
    |----------------------------------------------------------------|
    | Object (native and does    | "object"                          |
    | not implement [[Call]])    |                                   |
    |----------------------------------------------------------------|
    | Object (native or host and | "function"                        |
    | does implement [[Call]])   |                                   |
    |----------------------------------------------------------------|
    | Object (host and does not  | Implementation-defined except may |
    | implement [[Call]])        | not be "undefined", "boolean",    |
    |                            | "number", or "string".            |
    ------------------------------------------------------------------

यह व्यवहार फ्लोटिंग-पॉइंट अंकगणित (IEEE 754) के लिए IEEE मानक के अनुसार है :

4.3.19 संख्या मान

डबल-सटीक 64-बिट बाइनरी प्रारूप IEEE 754 मूल्य के अनुरूप आदिम मान

4.3.23 NaN

संख्या मान जो IEEE 754 "Not-a-Number" मान है

8.5 संख्या प्रकार

संख्या प्रकार वास्तव में है 18437736874454810627 (यह है कि, 2 53 -2 64 +3) मूल्यों, बाइनरी फ्लोटिंग प्वाइंट अंकगणित के लिए IEEE मानक में निर्दिष्ट है, को छोड़कर डबल परिशुद्धता 64 बिट प्रारूप आईईईई 754 मूल्यों का प्रतिनिधित्व करने कि 9007199254740990 ( अर्थात् , ५३ −2) IEEE मानक के विशिष्ट "नॉट-ए-नंबर" मूल्यों को एक विशेष NaN मूल्य के रूप में ECMAScript में दर्शाया गया है । (ध्यान दें कि NaN मान प्रोग्राम अभिव्यक्ति द्वारा निर्मित है NaN।)


5

NaN एक वैध फ्लोटिंग पॉइंट वैल्यू है ( http://en.wikipedia.org/wiki/NaN )

और NaN === NaN गलत है क्योंकि वे जरूरी नहीं कि एक ही गैर-संख्या हो


1
क्षमा करें, लेकिन मेरा कहना है कि इसके बारे में सोचने का यह एक अच्छा तरीका नहीं है। "जरूरी नहीं कि एक ही गैर-संख्या" का मतलब यह नहीं है कि वे हमेशा अलग-अलग होते हैं और उनकी तुलना करने पर झूठी उपज मिलनी चाहिए। यह सबसे अच्छा नहीं है कि NaN की मात्रा निर्धारित करें और इसे हमारे ज्ञानकोष में एक विषमता के रूप में समझें।
डेव

1
तो क्यों सभी Infinityकिसी भी तरह समान हैं? कोई विचार?
हाशम क़ोलमी

5

NaN != NaNक्योंकि वे समान संख्या में आवश्यक नहीं हैं। इस प्रकार यह बहुत समझ में आता है ... इसके अलावा फ्लोट में +0.00 और -0.00 दोनों क्यों नहीं हैं। गोलाई ऐसा कर सकती है कि वे वास्तव में शून्य नहीं हैं।

टाइपोफ़ के लिए, यह भाषा पर निर्भर करता है। और अधिकांश भाषाएं कहेंगी कि NaN एक फ्लोट, डबल या संख्या है जो इस बात पर निर्भर करता है कि वे इसे कैसे वर्गीकृत करते हैं ... मुझे कोई भी भाषा नहीं है जो यह कहेगी कि यह एक अज्ञात प्रकार या अशक्त है।


1
ehr, विचार करें: var x = parseInt ('कोई पासा'), y = x; अब मैं कहूंगा कि दोनों NaN बिल्कुल एक जैसे हैं? लेकिन नहीं, x === y गलत भी देता है।
KooiInc

हां, लेकिन आप SURE नहीं हो सकते, और इस प्रकार वे समान नहीं हैं। यह डेटाबेस में NULLable तर्क के समान तर्क है। हालांकि कई लोग उन्हें अन्य प्रोग्रामिंग भाषाओं से अशक्त संकेत के रूप में ही सोचते हैं, लेकिन वे एक बिल्कुल अलग शब्दार्थ है। वे "UNKNOWN" हैं और इस प्रकार दूसरे की तुलना में एक NULL मान हमेशा गलत है। NULL मान पर परिकलन करना परिणाम NULL के साथ समाप्त होता है। इसके बजाय UNKNOWN नामक मान के परिप्रेक्ष्य से इसे देखने का प्रयास करें
Cine

प्रकार के होने के नाते number , NaNआदिम है, और इसलिए विशिष्ट रूप से इसके मूल्य द्वारा निर्धारित किया जाता है।
दिमित्री ज़ैतसेव

4

NaNनंबर के लिए खड़ा है । यह संख्यात्मक डेटा प्रकारों (आमतौर पर फ़्लोटिंग पॉइंट प्रकार, लेकिन हमेशा नहीं) का एक मूल्य है जो अमान्य ऑपरेशन के परिणाम का प्रतिनिधित्व करता है जैसे कि शून्य से विभाजित करना।

यद्यपि इसके नाम कहते हैं कि यह एक संख्या नहीं है, इसे धारण करने के लिए उपयोग किया जाने वाला डेटा प्रकार एक संख्यात्मक प्रकार है। तो जावास्क्रिप्ट में, NaNरिटर्न के डेटाटाइप के लिए पूछ रहा है number(जैसा कि alert(typeof(NaN))स्पष्ट रूप से प्रदर्शित करता है)।


वास्तव में शून्य से विभाजित होने का मूल्यांकन Infinityनहीं किया जाता हैNaN
दिमित्री जैतसेव

2

जावास्क्रिप्ट एनएएन का उपयोग करता है, जिसका सामना कुछ भी करता है जो कि इसके विनिर्देशों द्वारा किसी अन्य तरीके से प्रतिनिधित्व नहीं किया जा सकता है। इसका मतलब यह नहीं है कि यह एक संख्या नहीं है। यह मुठभेड़ का वर्णन करने का सबसे आसान तरीका है। NaN का अर्थ है कि यह या एक वस्तु जो इसे संदर्भित करती है, का किसी अन्य तरीके से जावास्क्रिप्ट द्वारा प्रतिनिधित्व नहीं किया जा सकता है। सभी व्यावहारिक उद्देश्यों के लिए, यह 'अज्ञात' है। 'अज्ञात' होने के नाते यह आपको बता नहीं सकता कि यह क्या है और न ही यह स्वयं भी है। यह वह वस्तु भी नहीं है जिसे इसे सौंपा गया है। यह केवल आपको बता सकता है कि यह क्या नहीं है, और नहीं-नेस या कुछ भी नहीं केवल एक प्रोग्रामिंग भाषा में गणितीय रूप से वर्णित किया जा सकता है। चूंकि गणित संख्याओं के बारे में है, इसलिए जावास्क्रिप्ट NaN के रूप में शून्यता का प्रतिनिधित्व करता है। इसका मतलब यह नहीं है कि यह एक संख्या नहीं है। इसका मतलब है कि हम इसे किसी अन्य तरीके से नहीं पढ़ सकते हैं जो समझ में आता है। इसलिए यह कर सकते हैं ' टी भी खुद के बराबर है। क्योंकि यह नहीं है।


2

इसका बेहतर नाम NaN, इसका अर्थ अधिक सटीक और कम भ्रमित रूप से वर्णन करना, एक संख्यात्मक अपवाद होगा । यह वास्तव में आदिम प्रकार (भाषा डिजाइन द्वारा) के रूप में प्रच्छन्न अपवाद वस्तु है, जहां एक ही समय में इसकी झूठी आत्म-तुलना में इसे आदिम नहीं माना जाता है। भ्रम की स्थिति। और जब तक भाषा "अपना मन नहीं बनाएगी" उचित अपवाद वस्तु और आदिम अंक के बीच चयन करने के लिए , भ्रम रहेगा।

NaNस्वयं की बदनाम गैर-बराबरी , दोनों ==और ===एक भ्रामक डिजाइन की अभिव्यक्ति है जो इस अपवाद वस्तु को एक आदिम प्रकार होने के लिए मजबूर करता है। यह मौलिक सिद्धांत को तोड़ता है कि एक आदिम विशिष्ट रूप से इसके मूल्य से निर्धारित होता है । यदि NaNअपवाद के रूप में देखा जाना पसंद किया जाता है (जिनमें से विभिन्न प्रकार के हो सकते हैं), तो इसे आदिम के रूप में "बेचा" नहीं जाना चाहिए। और अगर यह आदिम होना चाहता है, तो उस सिद्धांत को पकड़ना चाहिए। जब तक यह टूटा हुआ है, जैसा कि हमारे पास जावास्क्रिप्ट में है, और हम वास्तव में दोनों के बीच तय नहीं कर सकते हैं, इसमें शामिल सभी के लिए अनावश्यक संज्ञानात्मक भार के लिए भ्रम की स्थिति बनी रहेगी। हालांकि, वास्तव में दोनों के बीच का चुनाव करके इसे ठीक करना आसान है:

  • या तो NaNएक विशेष अपवाद वस्तु बनाएं जिसमें अपवाद कैसे उत्पन्न हुआ, इस जानकारी को फेंकने के विपरीत उपयोगी है जो वर्तमान में लागू की गई है, जिससे कठिन-से-डिबग कोड हो जाता है;
  • या NaNआदिम प्रकार की एक इकाई बनाते हैं number(जो कि कम भ्रमित रूप से "संख्यात्मक" कहा जा सकता है), जिस स्थिति में यह स्वयं के बराबर होना चाहिए और इसमें कोई अन्य जानकारी नहीं हो सकती है; उत्तरार्द्ध स्पष्ट रूप से एक अवर विकल्प है।

प्रकार NaNमें मजबूर करने का एकमात्र कल्पनीय लाभ numberइसे किसी भी संख्यात्मक अभिव्यक्ति में वापस फेंकने में सक्षम हो रहा है। जो, हालांकि, इसे भंगुर विकल्प बनाता है, क्योंकि किसी भी संख्यात्मक अभिव्यक्ति वाले परिणाम NaNया तो होंगे NaN, या अप्रत्याशित परिणामों के लिए अग्रणी होंगे , जैसे कि NaN < 0मूल्यांकन करना false, अर्थात booleanअपवाद रखने के बजाय वापस लौटना ।

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

और फिर हमारे पास गन्दा शांत बनाम शोर उर्फ ​​सिग्नलिंग NaNभेद है । जो वास्तव में इस बारे में है कि अपवादों को कैसे नियंत्रित किया जाता है, स्वयं अपवादों को नहीं, और अन्य अपवादों से अलग कुछ भी नहीं।

इसी तरह, Infinityऔर वास्तविक रेखा के विस्तार में उत्पन्न होने वाले संख्यात्मक प्रकार के+Infinity तत्व हैं लेकिन वे वास्तविक संख्या नहीं हैं। गणितीय रूप से, उन्हें वास्तविक संख्याओं के अनुक्रमों द्वारा प्रस्तुत किया जा सकता है जो या तो परिवर्तित होते हैं ।+-Infinity


1

यह केवल इसलिए NaNहै क्योंकि जेएस में संख्या वस्तु की एक संपत्ति है, इसका कोई संख्या होने के साथ कोई लेना-देना नहीं है।


हर दूसरी वस्तु की तरह, नंबर में किसी भी प्रकार की संपत्ति हो सकती है। Number.fu = "bar"; alert(typeof Number.fu);
Alsciende

NaNNumber.NaNजो कुछ भी हो सकता है, उसमें संग्रहीत मूल्य नहीं है। NaNसंख्या प्रकार का एक आदिम मान है। और इसके अलावा, का मूल्य Number.NaNहै NaN, लेकिन यह असंबंधित है।
ओरिऑल

1

NAN के बारे में सोचने का सबसे अच्छा तरीका यह है कि इसकी कोई ज्ञात संख्या नहीं है । यही कारण है कि NAN! = NAN क्योंकि प्रत्येक NAN मान कुछ अद्वितीय अज्ञात संख्या का प्रतिनिधित्व करता है। NAN आवश्यक हैं क्योंकि फ्लोटिंग पॉइंट नंबरों में सीमित श्रेणी के मान होते हैं। कुछ मामलों में गोलाई होती है जहां निचले हिस्से खो जाते हैं जो कि 1.0 / 11 * 11! = 1.0 जैसी बकवास प्रतीत होती है। वास्तव में बड़े मूल्य जो अधिक से अधिक हैं NAN अनंत के साथ एक आदर्श उदाहरण हैं।

यह देखते हुए कि हमारे पास केवल दस अंगुलियां हैं 10 से अधिक मान दिखाने का कोई भी प्रयास असंभव है, जिसका अर्थ है कि ऐसे मान NAN होने चाहिए क्योंकि हमने इस से अधिक 10 मूल्य का वास्तविक मूल्य खो दिया है। यह फ़्लोटिंग पॉइंट मानों के लिए सही है, जहाँ मान एक फ़्लोट में आयोजित की जा सकने वाली सीमा से अधिक है।


इन्फिनिटी का प्रतिनिधित्व एक NaN द्वारा नहीं किया जाता है। सीमा से बाहर की संख्या का प्रतिनिधित्व करने का प्रयास नीचे (अधिकतम / -inf) या ऊपर (न्यूनतम / + inf) तक किया जाएगा।
ऑरेंजडॉग

1

क्योंकि NaN एक संख्यात्मक डेटा प्रकार है।


1

NaNएक प्रकार के दृष्टिकोण से एक संख्या है, लेकिन 1, 2 या 329131 की तरह एक सामान्य संख्या नहीं है। नाम "नॉट ए नंबर" इस तथ्य को दर्शाता है कि प्रतिनिधित्व किया गया मूल्य विशेष है और आईईईई प्रारूप कल्पना डोमेन के बारे में है, न कि जावास्क्रिप्ट भाषा डोमेन।


1

यदि jQuery का उपयोग कर रहा हूँ, तो मैं isNumericइस प्रकार की जाँच करना पसंद करता हूँ :

console.log($.isNumeric(NaN));  // returns false
console.log($.type(NaN));       // returns number

http://api.jquery.com/jQuery.isNumeric/


धन्यवाद दोस्त। मुझे टाइपस्क्रिप्ट के पैकेज isNumberसे समस्या थी util। अच्छा है कि हम अभी भी jQueryअपनी परियोजना में उपयोग करते हैं इसलिए इसके बजाय अपने सुझाव का उपयोग करें।
अशोक एमए

आरईसी के लिए, isNumberसे utilटाइपप्रति का भी रिटर्न trueके लिए NaN
अशोक एमए

0

जावास्क्रिप्ट में केवल एक संख्यात्मक डेटा प्रकार है, जो मानक 64-बिट डबल-सटीक फ्लोट है। सब कुछ एक डबल है। NaN डबल का एक विशेष मूल्य है, लेकिन फिर भी यह एक डबल नॉन है।

यह सब parseIntआपके स्ट्रिंग को एक संख्यात्मक डेटा प्रकार में "कास्ट" करना है, इसलिए परिणाम हमेशा "संख्या" है; केवल अगर मूल स्ट्रिंग पारगम्य नहीं था, तो इसका मान NaN होगा।


0

NaN अभी भी एक संख्यात्मक प्रकार है, लेकिन यह मान का प्रतिनिधित्व करता है जो एक मान्य संख्या का प्रतिनिधित्व नहीं कर सकता है।


0

हम तर्क दे सकते हैं कि NaN एक विशेष मामला वस्तु है। इस मामले में, NaN की वस्तु एक संख्या का प्रतिनिधित्व करती है जो गणितीय अर्थ नहीं बनाती है। गणित में कुछ अन्य विशेष वस्तुएं हैं जैसे कि INFINITE वगैरह।

आप अभी भी इसके साथ कुछ गणना कर सकते हैं, लेकिन यह अजीब व्यवहार पैदा करेगा।

यहाँ अधिक जानकारी: http://www.concentric.net/~ttwang/tech/javafloat.htm (जावा आधारित, जावास्क्रिप्ट नहीं)


0

आपको जावास्क्रिप्ट से प्यार हो गया है। यह कुछ दिलचस्प छोटी quirks है।

http://wtfjs.com/page/13

यदि आप उन्हें तार्किक रूप से काम करने के लिए रोकते हैं, या यदि आप संख्या सिद्धांत के बारे में थोड़ा जानते हैं, तो उनमें से अधिकांश को समझाया जा सकता है, लेकिन फिर भी यदि आप उनके बारे में नहीं जानते हैं, तो वे आपको पकड़ सकते हैं।

वैसे, मैं http://wtfjs.com/ के बाकी हिस्सों को पढ़ने की सलाह देता हूं - इसमें पाया जाने वाले की तुलना में बहुत अधिक रोचक क्विर्क हैं!


0

मान NaN वास्तव में Number.NaN है इसलिए जब आप पूछते हैं कि क्या यह एक संख्या है तो यह हां कहेगा। आपने isNaN () कॉल का उपयोग करके सही काम किया।

जानकारी के लिए, NaN को उन संख्याओं पर परिचालनों द्वारा भी लौटाया जा सकता है जिन्हें किसी ऋणात्मक संख्या के शून्य या वर्गमूल द्वारा विभाजनों की तरह परिभाषित नहीं किया गया है।


यह किस अर्थ में "मूल्य" है? NaN == Number.NaNका मूल्यांकन करता है false!
दिमित्री जैतसेव

@DmitriZaitsev क्या आपने धागा पढ़ा है? और क्या आपने कोशिश की है अगर (parseInt ("nan") == Number.NaN)? इसके अलावा प्रयास करें! = और देखें कि यह आपको क्या बताता है।
रोब

क्षमा करें, बेवकूफ भूल NaN==NaNजा रहा है false, चाहिए एक पीड़न कामुक, जो आविष्कार किया है कि हर कोई पीड़ित बनाने के लिए यह किया गया है।
दिमित्री जैतसेव

0

एक उदाहरण

कल्पना करें कि हम एक स्ट्रिंग को संख्या में परिवर्तित कर रहे हैं:

Number("string"); // returns NaN

हमने डेटा प्रकार को संख्या में बदल दिया है लेकिन इसका मूल्य एक संख्या नहीं है!


आपको लगता है कि प्रश्न के बिंदु से चूक गए हैं। NaNकी है नंबर लिखें। सवाल पूछ रहा है क्यों।
क्वेंटिन

@ क्वेंटिन मैंने अंतिम पंक्ति में समझाया।
अमीर फॉन

-1

यह POSITIVE_INFINITY के रूप में संख्या प्रकार का विशेष मूल्य है

क्यों? डिजाइन द्वारा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.