यदि कोई संख्या अनंत का मूल्यांकन करती है तो मैं कैसे जांच करूं?


94

मेरे पास जावास्क्रिप्ट गणनाओं की एक श्रृंखला है जो (केवल IE के तहत) उपयोगकर्ता की पसंद के आधार पर इन्फिनिटी दिखाती है।

Infinityउदाहरण के लिए प्रदर्शित होने वाले शब्द को कैसे रोकता है और उदाहरण के लिए, 0.0इसके बजाय दिखाता है ?

जवाबों:


174
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

आप संभवतः isFiniteइसके बजाय फ़ंक्शन का उपयोग कर सकते हैं , इस पर निर्भर करता है कि आप कैसे इलाज करना चाहते हैं NaNisFiniteरिटर्न falseअपना नंबर है अगर POSITIVE_INFINITY, NEGATIVE_INFINITYया NaN

if (isFinite(result))
{
    // ...
}

2
का प्रयोग क्यों Number.(POSITIVE|NEGATIVE)_INFINITYके बजाय -?Infinityया -?1/0?
एली ग्रे

5
@ ईली: वैश्विक Infinityसंपत्ति केवल-पढ़ने के लिए नहीं है, जिसका अर्थ है कि इसे फिर से परिभाषित किया जा सकता है: उदाहरण के लिए, "सही"var x = 42; Infinity = 42; alert(x === Infinity); प्रदर्शित करता है । (निश्चित रूप से यह एक अस्पष्ट मामला है, और जो कोई भी फिर से परिभाषित करने का फैसला करता है , आदि को अजीब चीजें होने की उम्मीद करनी चाहिए।)InfinityNaN
लूका

इस तथ्य को अनदेखा करना कि Number.(POSITIVE|NEGATIVE)_INFINITYकेवल-या तो पढ़ा नहीं है, केवल सख्त मोड में पढ़ा Infinity जाता है। इसके अलावा, -?1/0मैंने आपके सामने जो केस पेश किया है , उसका क्या ? वैसे भी, आपको isFiniteइसके बजाय लगभग हमेशा उपयोग करना चाहिए ।
एली ग्रे

1
@Eli: मेरे परीक्षणों में Number.POSITIVE_INFINITYऔर Number.NEGATIVE_INFINITY कर रहे हैं केवल पढ़ने के लिए (Chrome8, FF3.6 और IE8 पर परीक्षण)। 1/0काम का उपयोग करना ठीक है, लेकिन यह आपके कोड के अनुरक्षकों के लिए इतना स्पष्ट नहीं होगा कि आप वास्तव में क्या परीक्षण करना चाहते हैं। मैं मानता हूं कि isFiniteचीजों को करने का लगभग हमेशा बेहतर तरीका है - इसीलिए मैंने अपने उत्तर में इसका उल्लेख किया है - लेकिन केवल ओपी ही यह तय कर सकता है कि यह उनकी आवश्यकताओं को पूरा करता है या नहीं।
ल्यूक

4
वे केवल पढ़ने के लिए नहीं हैं (पढ़ें: गैर-विन्यास योग्य ), वे केवल गेटर्स के साथ एक्सेसर्स हैं लेकिन कोई बसने वाला नहीं है। आप उन्हें फिर से परिभाषित कर सकते हैं Object.definePropertyऔर __defineGetter__Infinityदूसरी ओर, है सख्त मोड में गैर-विन्यास।
एली ग्रे

9

एक सरल n === n+1या n === n/0काम करता है:

function isInfinite(n) {
  return n === n/0;
}

ध्यान रखें कि मूल isFinite()संख्याओं के लिए मूल coerces इनपुट। isFinite([])और उदाहरण के लिए isFinite(null)दोनों हैं true


यह उत्तर स्पष्ट है। n === n+12 ^ 53, अर्थात 1e30 से बड़ी सभी संख्याओं के लिए सही का मूल्यांकन करता है। विभाजन हैक काम करता है, यहां तक ​​कि NaN और -Infinity के लिए भी। हालांकि, ल्यूक का जवाब आपको वायाए को अधिक पठनीय कोड देता है।
tglas

@ टटलस ऐसा क्यों है? खुशी है कि विभाजन ठोस है। IMO मेरा कोड अधिक पठनीय और अधिक समावेशी है क्योंकि गणित शब्दों की तुलना में अधिक सार्वभौमिक है।
रानवे

1
क्योंकि IEEE 64bit फ़्लोट में 53 महत्वपूर्ण द्विआधारी अंक होते हैं ( en.wikipedia.org/wiki/IEEE_754 देखें ), इसलिए n+1इसका प्रतिनिधित्व नहीं किया जा सकता है और यह गोलाई के अधीन है। ठीक है, यहां तक ​​कि पूर्णांक त्रुटियों को गोल करने से भी प्रभावित होते हैं। Btw, मुझे नहीं लगता कि आपका कोड "गणित-प्रूफ" है, बस कोशिश करें n === n/-0। Reals को +/- inf के साथ पूरा करने पर, आपकी सीमा को अच्छी तरह से परिभाषित नहीं किया जाता है जब तक कि अंतर्निहित शून्य अनुक्रम को सकारात्मक नहीं माना जाता है।
tglas

धन्यवाद @tglas मुझे हमेशा अच्छा लगेगा कि जावास्क्रिप्ट शून्य से भाग कर सकती है :)
ryanve

6

में ES6, Number.isFinite()विधि यह निर्धारित करती है कि पारित मूल्य एक परिमित संख्या है या नहीं।

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true


2

वास्तव में n === n + 1 51 बिट से बड़ी संख्या के लिए काम करेगा, जैसे

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

3
यह ryanve के उत्तर पर एक टिप्पणी होनी चाहिए।
गैरी

1

मुझे विभिन्न प्रकार के रक्षात्मक कोडिंग कारणों के साथ-साथ पठनीयता के लिए लॉडश का उपयोग करना पसंद है। ईएस 6 महान है और इसमें गैर-संख्यात्मक मानों के मुद्दे नहीं हैं, लेकिन यदि ईएस 6 संभव नहीं है, तो आपके पास पहले से ही दर्ज है, या ब्रीफ़ कोड चाहते हैं: _.isFiniteNumber.isFinite

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

0

मैं एक ऐसे परिदृश्‍य में भाग गया हूं, जिसकी मुझे यह जाँच करने की आवश्‍यकता है कि क्‍या मान NaNया Infinityप्रकार का है, लेकिन मान्य परिणामों के रूप में तार पास करें। क्योंकि कई टेक्स्ट स्ट्रिंग्स झूठे-पॉजिटिव पैदा करेंगे NaN, मैंने इसे दरकिनार करने के लिए एक सरल उपाय किया है:

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

उपरोक्त कोड मानों को स्ट्रिंग्स में परिवर्तित करता है और जाँचता है कि क्या वे NaN या Infinity के समान हैं (आपको नकारात्मक अनन्तता के लिए कोई अन्य मामला जोड़ना होगा)।

इसलिए:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

यह पोस्ट वास्तव में यहां वास्तविक प्रश्न से संबंधित नहीं है और स्वीकार किए गए उत्तर के तहत एक टिप्पणी के रूप में बेहतर होगा। ओपी संख्या और अनंत के बारे में है, तार और NaNएस नहीं, आदि
code_dredd

आप शायद सही हैं, @code_dredd - उपाख्यान प्रासंगिक नहीं है। लेकिन समाधान अभी भी काम करता है: यह अनन्तता संख्या का पता लगा सकता है - कृपया मुझे सही करें अगर मैं गलत हूं।
dmitrizzle

ये अलग बात है। पहले से ही एक उत्तर है जो दिखाता है कि यह कैसे सही ढंग से करना है । आपके पास "काम" बस इसलिए होता है क्योंकि भाषा स्वयं मूर्खतापूर्ण बातें करती है और असंगत है कि यह किस प्रकार का प्रबंधन करती है। कृपया इस तरह हैक कोड लिखने से खुद को बचाएं।
code_dredd

अगर मैं toString()इसके बजाय इस्तेमाल करता तो क्या यह आपको अधिक खुश करता ? यह कैसे असंगत परिणाम दे सकता है या क्यों इस विधि की सिफारिश नहीं है नीचे या राज्य कारणों से मुक्त महसूस करें। अब तक, मुझे अभी भी यह लगता है कि जो कोई भी उत्तर की तलाश में है उसके लिए एक विकल्प जोड़ता है और कोई ठोस कारण नहीं है कि यह खतरनाक, अस्थिर क्यों है, आदि
dmitrizzle

-1

आप उपयोग कर सकते हैं खिड़की में अनंतisFinite(123) :

आप एक फ़ंक्शन लिख सकते हैं जैसे:

function isInfinite(num) {
 return !isFinite(num);
}

और जैसे उपयोग करें:

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true

आप Number.isFinitई भी कर सकते हैं जो यह भी जांचता है कि क्या मूल्य संख्या भी है और जाँच undefinedऔर nullआदि के लिए अधिक सटीक है ...

या आप इसे इस तरह से पॉलीफिल कर सकते हैं :

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.