उदाहरण के लिए, डॉलर के साथ, आपके पास $ 0.01 से कम की सटीकता नहीं है
क्या सचमे?
आप IEEE 754 फ़्लोटिंग पॉइंट संख्या के रूप में मुद्रा क्यों नहीं संग्रहित करना चाहते हैं, इस बारे में उम्र का पुराना मुद्दा।
कृपया IEEE 754 फ़्लोटिंग पॉइंट नंबरों में इंच स्टोर करने के लिए स्वतंत्र महसूस करें । वे ठीक-ठीक स्टोर करते हैं कि आप कैसे उम्मीद करेंगे।
कृपया आईईईई 754 फ़्लोटिंग पॉइंट नंबरों में किसी भी राशि को स्टोर करने के लिए स्वतंत्र महसूस करें, जिसे आप उन शासकों का उपयोग करके स्टोर कर सकते हैं जो एक शासक को एक इंच के अंशों में विभाजित करते हैं।
क्यों? क्योंकि जब आप IEEE 754 का उपयोग करते हैं तो आप इसे स्टोर कर रहे हैं।
इंच के बारे में बात यह है कि वे हिस्सों में विभाजित हैं। अधिकांश प्रकार की मुद्रा के बारे में बात यह है कि वे दसवें भाग में विभाजित हैं (कुछ प्रकार नहीं हैं लेकिन चलो केंद्रित रहें)।
यह अंतर सभी को भ्रमित करने वाला नहीं होगा, इसके अलावा, अधिकांश प्रोग्रामिंग भाषाओं के लिए, IEEE 754 फ़्लोटिंग पॉइंट नंबरों से इनपुट और आउटपुट दशमलव में व्यक्त किया गया है! जो बहुत अजीब है क्योंकि वे दशमलव में संग्रहीत नहीं हैं।
इस वजह से आपको कभी यह देखने को नहीं मिलता है कि जब आप कंप्यूटर को स्टोर करने के लिए कहते हैं तो कैसे अजीब चीजें करते हैं 0.1
। जब आप इसके खिलाफ गणित करते हैं तो आपको केवल अजीबता दिखाई देती है और इसमें अजीब त्रुटियां होती हैं।
से जोश बलोच के प्रभावी जावा :
System.out.println(1.03 - .42);
का उत्पादन 0.6100000000000001
इसके बारे में जो सबसे ज्यादा बता रहा है, 1
वह दायीं ओर बैठा रास्ता नहीं है । यह अजीब संख्या है जिसे इसे प्राप्त करने के लिए उपयोग किया जाना था। सबसे लोकप्रिय उदाहरण का उपयोग करने के बजाय 0.1
, हमें एक उदाहरण का उपयोग करना होगा जो समस्या को दिखाता है और उस दौर को टालता है जो इसे छिपाएगा।
उदाहरण के लिए, यह काम क्यों करता है?
System.out.println(.01 - .02);
का उत्पादन -0.01
क्योंकि हम भाग्यशाली हो गए।
मुझे उन समस्याओं से नफरत है जिनका निदान करना मुश्किल है क्योंकि मुझे कभी-कभी "भाग्यशाली" मिलता है।
IEEE 754 बस 0.1 ठीक से स्टोर नहीं कर सकता। लेकिन अगर आप इसे 0.1 स्टोर करने के लिए कहेंगे और फिर इसे प्रिंट करने के लिए कहेंगे तो यह 0.1 दिखाएगा और आपको लगेगा कि सब कुछ ठीक है। यह ठीक नहीं है, लेकिन आप इसे देख नहीं सकते क्योंकि यह 0.1 से वापस पाने के लिए गोल है।
कुछ लोग इन विसंगतियों को गोइंग एरर कहकर दूसरों से अलग होने को भ्रमित करते हैं। नहीं, ये गलतियाँ नहीं हैं। राउंडिंग वह कर रहा है जो इसे करना चाहिए और जो दशमलव में दशमलव नहीं है उसे स्क्रीन पर प्रिंट कर सकता है।
लेकिन यह मिसमैच को छुपाता है कि कैसे नंबर प्रदर्शित किया जाता है और इसे कैसे संग्रहीत किया जाता है। राउंडिंग होने पर त्रुटि नहीं हुई। यह तब हुआ जब आपने एक नंबर एक सिस्टम में डालने का फैसला किया जो इसे ठीक से स्टोर नहीं कर सकता और यह मान लिया कि जब यह ठीक से स्टोर नहीं किया जा रहा था।
कोई भी उम्मीद नहीं करता है कि in एक कैलकुलेटर में ठीक से स्टोर किया जा सकता है और वे इसके साथ काम करना ठीक समझते हैं। तो समस्या परिशुद्धता के बारे में भी नहीं है। यह अपेक्षित सटीकता के बारे में है। कंप्यूटर एक दसवें को 0.1
उसी तरह प्रदर्शित करते हैं, जैसा कि हमारे कैलकुलेटर करते हैं, इसलिए हम उनसे उम्मीद करते हैं कि एक दसवां हिस्सा पूरी तरह से हमारे गणनाकर्ताओं की तरह ही होगा। वे नहीं करते। जो आश्चर्य की बात है, क्योंकि कंप्यूटर अधिक महंगे हैं।
मुझे तुम बेमेल दिखाओ:
ध्यान दें कि 1/2 और 0.5 लाइन पूरी तरह से। लेकिन 0.1 सिर्फ लाइन अप नहीं करता है। यदि आप 2 से विभाजित करते हैं तो निश्चित रूप से आप पास हो सकते हैं, लेकिन आप इसे कभी नहीं मारेंगे। और हर बार जब हम विभाजित होते हैं तो हमें अधिक से अधिक बिट्स की आवश्यकता होती है। इसलिए 0.1 को किसी भी सिस्टम के साथ प्रतिनिधित्व करना जो 2 से विभाजित होता है, को अनंत संख्या में बिट्स की आवश्यकता होती है। मेरा हार्ड ड्राइव अभी इतना बड़ा नहीं है।
इसलिए IEEE 754 बिट्स से बाहर निकलते समय कोशिश करना बंद कर देता है। जो अच्छा है क्योंकि मुझे अपनी हार्ड ड्राइव पर कमरे की जरूरत है ... परिवार की तस्वीरें। सच में नहीं। परिवार की फ़ोटोज़। : पी
वैसे भी, आप जो टाइप करते हैं और जो आप देखते हैं वह दशमलव (दाईं ओर) है लेकिन जो आप स्टोर करते हैं वह बिकिमल्स (बाईं ओर) है। कभी-कभी वे पूरी तरह से समान होते हैं। कभी-कभी वे नहीं होते। कभी-कभी ऐसा लगता है जैसे वे वही हैं जब वे बस नहीं हैं। वह गोलाई है।
विशेष रूप से, हमें कुछ मुद्रा में मूल्यों को संग्रहीत करने और इसे प्रिंट करने में सक्षम होने के लिए क्या जानने की आवश्यकता है?
कृपया, यदि आप मेरे दशमलव आधारित पैसे को संभाल रहे हैं, तो फ़्लोट या डबल्स का उपयोग न करें।
अगर आपको यकीन है कि दसियों पैसे की चीजें शामिल नहीं होंगी तो बस पेनीज़ को स्टोर करें। यदि आप यह पता नहीं लगा रहे हैं कि इस मुद्रा की सबसे छोटी इकाई क्या होने वाली है और इसका उपयोग करें। यदि आप नहीं कर सकते हैं, तो BigDecimal जैसी किसी चीज़ का उपयोग करें ।
मेरा नेट वर्थ शायद ६४ बिट पूर्णांक में हमेशा ठीक रहेगा, लेकिन बिगइंटर जैसी चीजें इससे भी बड़ी परियोजनाओं के लिए काम करती हैं। वे देशी प्रकारों की तुलना में धीमे हैं।
यह पता लगाना कि इसे कैसे स्टोर करना है, यह केवल आधी समस्या है। याद रखें आपको इसे प्रदर्शित करने में सक्षम होना चाहिए। एक अच्छा डिज़ाइन इन दो चीजों को अलग करेगा। यहां तैरने का उपयोग करने के साथ वास्तविक समस्या यह है कि दो चीजें एक साथ फलीभूत होती हैं।