दिलचस्प पोस्ट
चलने वाले एक्स सर्वर के बिना matplotlib ग्राफ़ उत्पन्न करना स्टेडियम में फ्लोटिंग पॉइंट कीज़: मैप Utf-8 को PHP डिफ़ॉल्ट एन्कोडिंग सेट करना? Async कार्य समाप्त होने तक प्रतीक्षा कर रहा है ASP.NET MVC और मिश्रित मोड प्रमाणीकरण iphone रिबूट प्रोग्रामेटिक रूप से जवाफिक्स: स्थान त्रुटि सेट नहीं है पायथन सूची गुणन: ] * 3 ऐसी 3 सूचियां बनाती हैं जो एक दूसरे को दर्पण करती हैं जब संशोधित एक्सएचआर अनुरोध से ब्लॉब डेटा प्राप्त करना एंड्रॉइड में गतिविधि के लिए सेवा बाँधें ग्रहण सफलतापूर्वक संकलित करता है लेकिन अभी भी अर्थ त्रुटियाँ देता है प्रतिबिंब के माध्यम से वैकल्पिक पैरामीटर के साथ तरीकों को शामिल करना सी + + प्रीप्रोसेसर # एक कीवर्ड को परिभाषित करना। क्या यह मानक मानता है? तीन। जेएस कैमरा ऊपर या नीचे झुकता है और क्षितिज का स्तर रखता है कैसे डीबग करने के लिए। Htaccess RewriteRule काम नहीं कर रहा है

बड़ी संख्या में जावास्क्रिप्ट में गलती से गोल

यह कोड देखें:

<html> <head> <script src="http://www.json.org/json2.js" type="text/javascript"></script> <script type="text/javascript"> var jsonString = '{"id":714341252076979033,"type":"FUZZY"}'; var jsonParsed = JSON.parse(jsonString); console.log(jsonString, jsonParsed); </script> </head> <body> </body> </html> 

जब मैं फ़ायरफ़ॉक्स 3.5 में अपना कंसोल देखता हूं, तो jsonParsed का मान है:

 Object id=714341252076979100 type=FUZZY 

Ie संख्या गोल है। विभिन्न मानों की कोशिश की, एक ही परिणाम (संख्या गोल)।

मैं भी अपने गोल नियमों को नहीं मिलता है 714341252076979136 को 714341252076979200 पर गोल किया गया है, जबकि 714341252076979135 को 714341252076979100 पर गोल किया गया है।

संपादित करें: नीचे पहली टिप्पणी देखें। जाहिरा तौर पर ये JSON के बारे में नहीं है, लेकिन जावास्क्रिप्ट नंबर हैंडलिंग के बारे में कुछ। लेकिन सवाल बाकी है:

ये क्यों हो रहा है?

वेब के समाधान से एकत्रित समाधान "बड़ी संख्या में जावास्क्रिप्ट में गलती से गोल"

आप यहां क्या देख रहे हैं वास्तव में दो गोलियों का प्रभाव है ईसीएमएस्क्रिप्ट में संख्याएं आंतरिक रूप से दोहरे सटीक अस्थायी बिंदु का प्रतिनिधित्व करती हैं। जब id को 714341252076979033 (हेक्स में 0x9e9d9958274c359 ) पर सेट किया 714341252076979033 , तो इसे वास्तव में निकटतम 714341252076979072 डबल- 714341252076979072 मान असाइन किया जाता है, जो 714341252076979072 ( 0x9e9d9958274c380 ) है। जब आप मूल्य मुद्रित करते हैं, तो इसे 15 महत्वपूर्ण दशमलव अंकों में गोल किया जाता है, जो 14341252076979100 देता है।

आप जावास्क्रिप्ट के नंबर प्रकार की क्षमता से अधिक उगल रहे हैं, विवरण के लिए §8.5 का विवरण देखें। उन आईडी को स्ट्रिंग होने की आवश्यकता होगी।

आईईईई -754 डबल-स्पेसिफिक फ्लोटिंग प्वाइंट (जिस तरह की जावास्क्रिप्ट का उपयोग करता है) सभी नंबरों को ठीक से प्रदर्शित नहीं कर सकता (बेशक)। प्रसिद्ध, 0.1 + 0.2 == 0.3 गलत है। यह पूरी संख्याओं को प्रभावित कर सकता है जैसे यह आंशिक संख्या को प्रभावित करता है; यह 9 007,199,254,740,991 ( Number.MAX_SAFE_INTEGER ) से ऊपर उठने पर यह शुरू हो जाता है।

संख्या से परे। Number.MAX_SAFE_INTEGER + 1 ( 9007199254740992 ), आईईईई 9007199254740992 फ़्लोटिंग-प्वाइंट फ़ॉर्मेट अब हर लगातार पूर्णांक का प्रतिनिधित्व नहीं कर सकता है 9007199254740991 + 1 9007199254740992 , लेकिन 9007199254740992 + 1 भी 9007199254740992 क्योंकि प्रारूप में 9007199254740993 प्रतिनिधित्व नहीं किया जा सकता। अगले 9007199254740994 हो सकता है फिर 9007199254740995 नहीं हो सकता, लेकिन 9007199254740996 कर सकते हैं

इसका कारण यह है कि हम बिट्स से भाग चुके हैं, इसलिए अब हमारे पास 1 एस बिट नहीं है; न्यूनतम क्रम बिट 2 के गुणकों को दर्शाता है। आखिरकार, यदि हम जारी रखते हैं, तो हम उस बिट को खो देते हैं और केवल 4 के गुणकों में काम करते हैं। और इसी तरह।

आपके मूल्य उस सीमा से ऊपर हैं, और इसलिए वे निकटतम प्रस्तुति योग्य मान में गोल हो जाते हैं।


यदि आप बिट्स के बारे में उत्सुक हैं, तो यहाँ क्या होता है: एक आईईईई -754 बाइनरी डबल-स्पेसिज़न फ्लोटिंग-पॉइंट नंबर का चिन्ह बिट, एक्सपोनेंट के 11 बिट्स (जो कि संख्या के समग्र पैमाने को परिभाषित करता है, 2 की शक्ति के रूप में [ क्योंकि यह एक बाइनरी प्रारूप है)), और 52 बिट्स महत्व (लेकिन प्रारूप इतनी चतुर है कि यह उन 52 बिट्स से 53 बिट सटीक हो जाता है)। कैसे एक्सपोनेंट का प्रयोग किया जाता है जटिल ( वर्णित है ), लेकिन बहुत अस्पष्ट शब्दों में, यदि हम एक को एक्सपोनेंट में जोड़ते हैं, तो महत्व का मूल्य दोगुना हो जाता है, क्योंकि एक्सपोनेंट 2 की शक्तियों के लिए उपयोग किया जाता है (फिर से, वहां की चेतावनी, यह है प्रत्यक्ष नहीं, वहाँ में चतुराई है)।

तो हम मूल्य 9007199254740991 (उर्फ, संख्या। Number.MAX_SAFE_INTEGER ) देखें:

 + ------------------------------------------------- -------------- साइन बिट
 / + ------- + ---------------------------------------- -------------- प्रतिपादक
 / / |  + ------------------------------------------------- + - महत्व और
 / / |  / |
 0 10000110011 1111111111111111111111111111111111111111111111111111
 = 9007199254740991 (संख्या.एमएक्स_एएफ़_आईएनटीजीईआर)

उस 10000110011 मूल्य, 10000110011 , का मतलब है कि हर बार जब हम एक को महत्व देते हैं, तो संख्या का प्रतिनिधित्व 1 तक चला जाता है (संपूर्ण संख्या 1, हम बहुत पहले आंशिक संख्याओं का प्रतिनिधित्व करने की क्षमता खो देते हैं)

लेकिन अब यह महत्व और पूर्ण है। उस संख्या से पीछे जाने के लिए, हमें एक्सपोनेंट में वृद्धि करना होगा, जिसका अर्थ है कि यदि हम महत्व को जोड़ते हैं, तो संख्या का मूल्य 2 से बढ़ जाता है, न 1 (क्योंकि एक्सपोनेंट 2 पर लागू होता है, इसका आधार बाइनरी फ़्लोटिंग प्वाइंट नंबर):

 + ------------------------------------------------- -------------- साइन बिट
 / + ------- + ---------------------------------------- -------------- प्रतिपादक
 / / |  + ------------------------------------------------- + - महत्व और
 / / |  / |
 0 10000110100000000000000000000000000000000000000000000000000000000
 = 9007199254740992 (संख्या.एमएक्स_एएफ_आईएनटीजीईआर + 1)

ठीक है, यह ठीक है, क्योंकि 9007199254740991 + 1 9007199254740992 वैसे भी है। परंतु! हम 9007199254740993 प्रतिनिधित्व नहीं कर सकते हम बिट्स से भाग चुके हैं यदि हम केवल 1 महत्व को जोड़ते हैं, तो यह 2 से जोड़ता है मूल्य:

 + ------------------------------------------------- -------------- साइन बिट
 / + ------- + ---------------------------------------- -------------- प्रतिपादक
 / / |  + ------------------------------------------------- + - महत्व और
 / / |  / |
 0 10000110100000000000000000000000000000000000000000000000000000001
 = 9007199254740994 (संख्या.एमएक्स_एएफ_आईएनटीजीईआर + 3)

प्रारूप सिर्फ अजीब संख्या का प्रतिनिधित्व नहीं कर सकता क्योंकि हम मूल्य बढ़ाते हैं, प्रतिपादक बहुत बड़ा है

आखिरकार, हम फिर से महत्व और बिट्स से बाहर निकलते हैं और एक्सपोनेंट में वृद्धि करते हैं, इसलिए हम केवल 4 के गुणकों का प्रतिनिधित्व करने में सक्षम होते हैं। फिर 8 के गुणक। फिर 16 के गुणक। और इसी तरह।

यह इस जेएसएनएन पार्सर के कारण नहीं है बस फेंग कंसोल के लिए 714341252076979033 दर्ज करने का प्रयास करें। आप एक ही 714341252076979100 देखेंगे।

विवरण के लिए इस ब्लॉग पोस्ट को देखें: http://www.exploringbinary.com/print-precision-of-floating-point-integers-varies-too

जावास्क्रिप्ट डबल सटीक फ़्लोटिंग पॉइंट वैल्यूज़ का उपयोग करता है, अर्थात कुल 53 बिट्स की सटीकता है, लेकिन आपको इसकी ज़रूरत है

 ceil(lb 714341252076979033) = 60 

वास्तव में मूल्य का प्रतिनिधित्व करने के लिए बिट्स

निकटतम वास्तव में प्रतिनिधित्व योग्य संख्या 714341252076979072 (बाइनरी में मूल संख्या लिखें, आखिरी 7 अंकों को 0 साथ बदलें और गोल करें, क्योंकि उच्चतम स्थान वाला अंक 1 था)।

आपको इस नंबर के बजाय 714341252076979100 प्राप्त 714341252076979100 क्योंकि ईसीएमए -262 के अनुसार वर्णित टूस्ट्रिंग ToString() , § 9.8.1 दस की शक्तियों के साथ काम करता है और 53 बिट सटीक में इन सभी नंबर समान हैं।

आपकी समस्या यह है कि जावास्क्रिप्ट के मुकाबले आपकी संख्या को अधिक सटीक आवश्यकता है

क्या आप स्ट्रिंग के रूप में नंबर भेज सकते हैं? दो भागों में विभाजित?

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