2011-12-29 7 views
47

मैं [{id: 12000000000002539, Name: "Some Name"}] जैसे कच्चे डेटा को स्थानांतरित कर रहा हूं और मुझे पार्सिंग के बाद ऑब्जेक्ट [{id: 12000000000002540, Name: "Some Name"}] मिल रहा है, क्योंकि अब सर्वर पक्ष स्ट्रिंग में आईडी को परिवर्तित करने में मदद करता है। लेकिन क्या बड़े डेटा को सही तरीके से स्थानांतरित करने का एक बेहतर तरीका है?बड़े पैमाने पर JSON स्थानांतरण: 12000000000002539 को 12000000000002540 में परिवर्तित कर दिया गया है?

+1

यदि आप यही पूछ रहे हैं तो आप सी में 'लंबे समय तक' जैसे कुछ नहीं कर सकते हैं। स्ट्रिंग शायद जाने का बेहतर तरीका है। – Chad

+5

यह अनिवार्य रूप से कल से इस प्रश्न के समान है: http://stackoverflow.com/q/8641668/615754। जावास्क्रिप्ट बड़ी संख्या का प्रतिनिधित्व कर सकता है, लेकिन परिशुद्धता के केवल 15 या 16 अंकों के साथ। – nnnnnn

+0

यह JSON FCOL –

उत्तर

84

मूल्य वास्तव में नहीं जावास्क्रिप्ट में अधिकतम सांख्यिक मान (जो 1.7 या तो "केवल" है) से अधिक है।

हालांकि, मूल्य "अभिन्न परिशुद्धता" की सीमा से अधिक है। ऐसा नहीं है कि गलत नंबर नहीं भेजा जाता है है: बल्कि, यह है कि शाब्दिक केवल ठीक के रूप में 12000000000002540 के रूप में प्रतिनिधित्व किया जा सकता है, और इस तरह वहाँ कभी नहीं जावास्क्रिप्ट में सही संख्यात्मक मान था। (range of integrals के बारे में +/- 2 है।)

यह (आईईईई-754 बात में binary64) a double relative-precision का उपयोग कर, सभी संख्यात्मक मान स्टोर करने के लिए टाइप करें पूर्णांकों सहित का एक दिलचस्प घटना है:

12000000000002539 === 12000000000002540 // true 

दशमलव अंकों की अधिकतम संख्या जो सटीक रूप से एक संख्यात्मक मान के रूप में संग्रहीत की जाती है वह 15 (15.9 5, वास्तव में) है। उपर्युक्त में, 17 महत्वपूर्ण अंक हैं, इसलिए में से कुछ कम से कम महत्वपूर्ण जानकारी चुपचाप खो गई है। इस मामले में, के रूप में जावास्क्रिप्ट पार्सर/इंजन शाब्दिक मूल्य में पढ़ता है।

जावास्क्रिप्ट में इस परिमाण की अभिन्न संख्या को संभालने का एकमात्र सुरक्षित तरीका स्ट्रिंग अक्षर का उपयोग करना या इसे किसी अन्य फैशन में तोड़ना है (उदा। कस्टम संख्यात्मक प्रकार या "bigint library")। हालांकि, मैं सिर्फ एक स्ट्रिंग का उपयोग करने की अनुशंसा करता हूं, क्योंकि यह मानव पठनीय, अपेक्षाकृत कॉम्पैक्ट (JSON में केवल दो अतिरिक्त वर्ण) है, और विशेष क्रमिकरण की आवश्यकता नहीं है। चूंकि मान इस मामले में सिर्फ एक "आईडी" है, इसलिए मुझे उम्मीद है कि गणित पर इसे करने की आवश्यकता नहीं है :)

हैप्पी कोडिंग।

+2

अद्भुत चीजें! – VvDPzZ

+7

+1 सुंदर जवाब। – alex

+9

यह ध्यान देने योग्य है कि जेएसओएन ([आरएफसी 4627] (http://www.ietf.org/rfc/rfc4627)) इस बात की कोई गारंटी नहीं देता है कि जेएसओएन उपभोक्ताओं को कितने संख्याओं का प्रतिनिधित्व करने में सक्षम होना आवश्यक है, इसलिए उत्तर अलग हो सकता है अन्य ग्राहकों के लिए: "एक कार्यान्वयन संख्याओं की सीमा पर सीमा निर्धारित कर सकता है।" –