2012-11-17 16 views
27

क्या कोई मुझे बता सकता है कि 99 99 99 99 99 99 99 99 10000000000000000 में क्यों परिवर्तित हो गया है?99 99 99 99 99 99 99 99 जावास्क्रिप्ट में 10000000000000000 में क्यों परिवर्तित किया गया है?

alert(9999999999999999); //10000000000000000 

http://jsfiddle.net/Y2Vb2/

+2

वह नंबर एक पूर्णांक में फिट करने के लिए बहुत बड़ी है, इसलिए संभवतः एक डबल में बदल जाती है। फ़्लोटिंग पॉइंट नंबर सटीक नहीं हैं। –

+1

रूप @Kos कहा सब जावास्क्रिप्ट यह संख्या दोगुनी परिशुद्धता चल बिन्दु संख्या, मतलब है कि आप परिशुद्धता के केवल 16 अंकों कर रहे हैं, और '9999999999999999' स्पष्ट रूप से उस सीमा – Ravi

+6

संबंधित गुजरता है: उच्चतम पूर्णांक है कि 100% परिशुद्धता के साथ इस्तेमाल किया जा सकता में जावास्क्रिप्ट है ** +/- 9007199254740992 ** (या 'Math.pow (2,53) '): http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest- पूर्णांक-मूल्य-ए-संख्या-कैन-गो-टी – David

उत्तर

20
  1. जावास्क्रिप्ट केवल अस्थायी है बिन्दु संख्या, कोई पूर्णांक:

    जावा में इसी तरह के मुद्दे देखें।

  2. पढ़ें What Every Computer Scientist Should Know About Floating-Point Arithmetic

    सारांश: चल बिन्दु संख्या केवल सीमित परिशुद्धता, 15 से अधिक अंक (या तो) और आप गोलाई प्राप्त करेंगे शामिल हैं।

9

9999999999999999 को जावास्क्रिप्ट में आंतरिक रूप से फ्लोटिंग-पॉइंट नंबर के रूप में माना जाता है। इसे आईईईई 754 डबल परिशुद्धता में सटीक रूप से प्रदर्शित नहीं किया जा सकता है क्योंकि इसके लिए 54 बिट परिशुद्धता की आवश्यकता होगी (बिट्स की संख्या लॉग 2 (99 99 99 99 99 99 99 99) = 53,150849512 है ... और चूंकि आंशिक बिट मौजूद नहीं हैं, परिणाम को ऊपर उठाया जाना चाहिए) जबकि आईईईई 754 केवल 53 बिट्स प्रदान करता है (1 इंफ्लिक्ट बिट + 52 मंथिसा के स्पष्ट रूप से संग्रहीत बिट्स) - एक बिट कम। इसलिए संख्या बस गोल हो जाती है।

चूंकि इस मामले में केवल एक बिट खो गया है, यहां तक ​​कि 54-बिट संख्याएं भी बिल्कुल प्रतिनिधित्व योग्य हैं, क्योंकि फिर भी वे 0 बिट में खो जाते हैं, जो खो जाता है। अजीब 54-बिट संख्या निकटतम मान के लिए गोलाकार होती है जो आईईईई 754 के डिफ़ॉल्ट निष्पक्ष गोल करने वाले मोड को दोगुनी 53-बिट संख्या होती है।

+3

विषम संख्याएं हमेशा गोल नहीं होती हैं। सामान्य अभ्यास बैंकर के गोलाकार का उपयोग करना है, इसलिए वे चारों के निकटतम एकाधिक में गोल हो जाते हैं। Google क्रोम कंसोल में एक त्वरित परीक्षण इसकी पुष्टि करता है। –

+0

मैं सही खड़ा हूँ। –

+0

आईईईई में कई अलग-अलग राउंडिंग मोड हैं, लेकिन डिफ़ॉल्ट रूप से (जो जेएस का उपयोग करता है) यह निकटतम बाइनरी संख्या की ओर आधे रास्ते के मामले में है। कुछ परिस्थितियों में यह चार में से एक है, लेकिन हमेशा नहीं। –

3

प्रश्न: कभी-कभी जावास्क्रिप्ट गणनाएं "गलत" परिणाम उत्पन्न करती हैं, उदा। 0.362 * 100 उपज 36.1 99 99 99 99 99 99 6 9। इससे कैसे बचा जा सकता है?

उत्तर: आंतरिक रूप से जावास्क्रिप्ट 52-बिट मंटिसा और 11-बिट एक्सपोनेंट (संख्यात्मक मानों को संग्रहीत करने के लिए आईईईई 754 मानक) के साथ डबल-परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप में सभी नंबरों को स्टोर करता है। संख्याओं का यह आंतरिक प्रतिनिधित्व उपरोक्त की तरह अप्रत्याशित परिणाम हो सकता है। 253 = 9007199254740992 से अधिकतर अधिकांश पूर्णांक इस प्रारूप में बिल्कुल प्रदर्शित नहीं किए जा सकते हैं। इसी तरह, 0.362 जैसे कई दशमलव/अंश, बिल्कुल प्रतिनिधित्व नहीं किए जा सकते हैं, जो उपर्युक्त उदाहरण में अनुमानित "गलत" है। इन "गलत" परिणामों से बचने के लिए, आप परिणामों का उपयोग आपके द्वारा उपयोग किए जाने वाले डेटा की सटीकता के लिए करना चाहते हैं।

http://www.javascripter.net/faq/accuracy.htm

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