आप कम से कम एक बैकअप के रूप में अपनी मुद्रा को स्टोर करना चाहते हैं long
और अपनी मुद्रा की गणना करना चाहते हैं double
। आप सभी चाहते हैं लेनदेन के रूप में जगह लेने के लिए long
।
जिस कारण से आप अपनी मुद्रा को स्टोर करना चाहते हैं, long
वह यह है कि आप किसी भी मुद्रा को खोना नहीं चाहते हैं।
मान लीजिए कि आप एक का उपयोग करते हैं double
, और आपके पास कोई पैसा नहीं है। कोई आपको तीन डिम देता है, और फिर उन्हें वापस ले जाता है।
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
खैर, यह इतना अच्छा नहीं है। हो सकता है कि $ 10 वाले कोई व्यक्ति पहले आपको तीन बार दे कर अपना भाग्य दूर करना चाहता हो, और फिर $ 9.70 किसी और को दे रहा हो।
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
और फिर आप उन्हें वापस दे देते हैं:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
यह अभी टूटी है।
अब, चलो एक लंबे समय का उपयोग करते हैं, और हम दसियों सेंट्स (इसलिए 1 = $ 0.001) का ट्रैक रखेंगे। आइए ग्रह पर सभी को एक अरब, एक सौ बारह मिलियन, पचहत्तर हजार, एक सौ तैंतालीस डॉलर देते हैं:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
उम, रुको, हम सभी को एक अरब डॉलर से अधिक दे सकते हैं, और केवल दो पर थोड़ा खर्च कर सकते हैं? यहां ओवरफ्लो एक आपदा है।
इसलिए, जब भी आप किसी धनराशि की गणना के लिए स्थानांतरण, उपयोग करें double
और Math.round
इसे प्राप्त करें long
। फिर उपयोग करके शेष राशि को जोड़ें (दोनों खातों को जोड़ें और घटाएं) long
।
आपकी अर्थव्यवस्था लीक नहीं होगी, और यह एक क्वाड्रिलियन डॉलर तक बढ़ जाएगी।
अधिक मुश्किल मुद्दे हैं - उदाहरण के लिए, यदि आप बीस भुगतान करते हैं तो आप क्या करते हैं? * - लेकिन यह आपको शुरू करना चाहिए।
* आप गणना करते हैं कि एक भुगतान क्या है, इसके लिए गोल long
; फिर से गुणा 20.0
करें और जांचें कि यह सीमा में है; यदि ऐसा है, तो आप 20L
अपनी शेष राशि में से कटौती के लिए भुगतान को गुणा करते हैं । सामान्य तौर पर, सभी लेन-देन के रूप में संभाला जाना चाहिए long
, इसलिए आपको वास्तव में सभी व्यक्तिगत लेनदेन को योग करने की आवश्यकता है; आप एक शॉर्टकट के रूप में गुणा कर सकते हैं, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आप गोलाई की त्रुटियों को नहीं जोड़ते हैं और आप अतिप्रवाह नहीं करते हैं, जिसका अर्थ है कि आपको double
वास्तविक गणना करने से पहले जांच करनी होगी long
।