2012-10-17 11 views
6

मैंने स्ट्रिंग को बेस 36 में कनवर्ट करते समय पाइथन और जावास्क्रिप्ट के बीच कुछ विसंगतियों को देखा है।भाषाओं के बीच बेस 36 असंगतता में स्ट्रिंग को कनवर्ट करना।

अजगर विधि:

>>> print int('abcdefghijr', 36) 

परिणाम: 37713647386641447

जावास्क्रिप्ट विधि:

<script> 
    document.write(parseInt("abcdefghijr", 36)); 
</script> 

परिणाम: 37713647386641450

दो भाषाओं के बीच अलग-अलग नतीजे क्या हैं? भाषा के अनियंत्रित परिणामों के उत्पादन के लिए सबसे अच्छा तरीका क्या होगा?

धन्यवाद।

+4

देखें http://stackoverflow.com/questions/5812096/javascript-large-integer-round-because-precision- क्यों; जावास्क्रिप्ट में पाइथन जैसे मनमानी सटीक बड़े पूर्णांक नहीं हैं। (केवल जावास्क्रिप्ट कंसोल में '37713647386641447' टाइप करने से आपको एक ही गोलाकार मूल्य मिलेगा) – geoffspear

उत्तर

10

उस संख्या में 56 बिट्स का प्रतिनिधित्व करने के लिए लगता है। जावास्क्रिप्ट की संख्या वास्तव में double-precision binary floating point numbers, या double संक्षिप्त के लिए है। ये कुल 64 बिट हैं, और 64 बिट पूर्णांक की तुलना में मूल्यों के रेंज का प्रतिनिधित्व कर सकते हैं, लेकिन वे इसे कैसे प्राप्त करते हैं (वे mantissa * 2^exponent के रूप में एक संख्या का प्रतिनिधित्व करते हैं), वे उस श्रेणी में सभी संख्याओं का प्रतिनिधित्व नहीं कर सकते , केवल वे लोग जो 2^exponent के एकाधिक हैं, जहां कई मंटिसा में फिट बैठते हैं (जिसमें 2^0 = 1 शामिल है, इसलिए आपको सभी पूर्णांक मंटिसा सीधे संभाल सकता है)। मंथिसा 53 बिट्स है, जो इस नंबर के लिए अपर्याप्त है। तो यह एक संख्या के लिए गोल हो जाता है जो का प्रतिनिधित्व किया जा सकता है।

आप क्या कर सकते हैं एक थर्ड पार्टी लाइब्रेरी द्वारा परिभाषित मनमानी सटीक संख्या प्रकार का उपयोग करें जैसे gwt-math या Big.js। यदि आप अपने स्कूल अंकगणित जानते हैं तो इन नंबरों को लागू करना मुश्किल नहीं है। इसे कुशलता से करना एक और मामला है, लेकिन व्यापक शोध का एक क्षेत्र भी है। और यदि आप मौजूदा पुस्तकालय का उपयोग करते हैं तो आपकी समस्या नहीं है।

+0

ग्रेट स्पष्टीकरण। धन्यवाद। –