javascript - जावास्क्रिप्ट में दो दशमलव जोड़ना गलत परिणाम क्यों उत्पन्न करता है?




math floating-point (4)

संभावित डुप्लिकेट:
क्या जावास्क्रिप्ट का गणित टूटा हुआ है?

जेएस ने इस सरल गणित को क्यों खींचा?

document.write(.1 + .2)  // 0.3000000000000004
document.write(.3 + .6)  // 0.8999999999999999

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

मैंने जवाब के लिए कई जगहों पर देखा है। कुछ ट्यूटोरियल्स (जैसे शॉपिंग कार्ट फॉर्म) का दावा करते हैं कि समस्या मौजूद नहीं है और केवल मूल्यों को एक साथ जोड़ दें। गुरु विभिन्न गणित कार्यों के लिए जटिल दिनचर्या प्रदान करते हैं या जेएस का उल्लेख करते हुए "खराब काम करता है" का उल्लेख करते हैं, लेकिन मुझे अभी तक एक स्पष्टीकरण दिखाई नहीं दे रहा है।


यह एक जेएस समस्या नहीं है लेकिन एक सामान्य कंप्यूटर एक है। फ़्लोटिंग नंबर ठीक से सभी दशमलव संख्याओं को स्टोर नहीं कर सकता है, क्योंकि वे बाइनरी में सामान संग्रहीत करते हैं उदाहरण के लिए:

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc

so in binary 0.1 is 0.00011... 

लेकिन यह अंतहीन है। कंप्यूटर को कुछ बिंदु पर रोकना है। तो अगर हमारे उदाहरण में हम 0.00011 पर रुकते हैं तो हमारे पास 0.1 के बजाय 0.09375 है।

वैसे भी बिंदु यह है कि यह भाषा पर निर्भर नहीं है बल्कि कंप्यूटर पर। भाषा पर निर्भर करता है कि आप संख्याओं को कैसे प्रदर्शित करते हैं। आम तौर पर, भाषा गोल संख्या स्वीकार्य प्रतिनिधित्व के लिए होती है। जाहिर है जेएस नहीं करता है।

तो आपको क्या करना है (स्मृति में संख्या पर्याप्त सटीक है) किसी भी तरह जेएस को "अच्छी तरह से" संख्या को गोल करने के लिए कहने के लिए कहती है जब उन्हें टेक्स्ट में परिवर्तित किया जाता है।

आप sprintf फ़ंक्शन का प्रयास कर सकते हैं जो आपको एक संख्या को प्रदर्शित करने का एक अच्छा नियंत्रण देता है।


यह कंप्यूटर के साथ फ़्लोटिंग नंबरों को संभालने के साथ करना है। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: http://docs.sun.com/source/806-3568/ncg_goldberg.html


यह सभी प्रोग्रामिंग भाषाओं के लिए सामान्य है क्योंकि सभी दशमलव मानों को बिल्कुल बाइनरी में प्रदर्शित नहीं किया जा सकता है। देखें कि फ्लोटिंग-पॉइंट अंकगणितीय के बारे में प्रत्येक कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए


फ़्लोटिंग-पॉइंट गाइड से :

मेरी संख्या क्यों नहीं है, जैसे 0.1 + 0.2 एक अच्छा दौर 0.3 तक जोड़ती है, और इसके बजाय मुझे 0.30000000000000004 जैसे अजीब परिणाम मिलते हैं?

आंतरिक रूप से, कंप्यूटर एक प्रारूप (बाइनरी फ़्लोटिंग-पॉइंट) का उपयोग करते हैं जो सटीक रूप से 0.1, 0.2 या 0.3 जैसी संख्या का प्रतिनिधित्व नहीं कर सकता है।

जब कोड संकलित या व्याख्या किया जाता है, तो आपका "0.1" पहले से ही उस प्रारूप में निकटतम संख्या में गोल होता है, जिसके परिणामस्वरूप गणना होने से पहले भी एक छोटी गोलिंग त्रुटि होती है।

इस साइट में विस्तृत स्पष्टीकरण के साथ-साथ समस्या को ठीक करने के बारे में जानकारी है (और यह तय करने के लिए कि क्या यह आपके मामले में एक समस्या है)।





decimal