मैं समझता हूँ कि BigDecimal जावा में मौद्रिक मूल्यों का प्रतिनिधित्व करने के लिए सर्वोत्तम अभ्यास की सिफारिश की जाती है। तुम क्या इस्तेमाल करते हो? क्या एक बेहतर पुस्तकालय है जिसे आप इसके बजाय उपयोग करना पसंद करते हैं?
मैं समझता हूँ कि BigDecimal जावा में मौद्रिक मूल्यों का प्रतिनिधित्व करने के लिए सर्वोत्तम अभ्यास की सिफारिश की जाती है। तुम क्या इस्तेमाल करते हो? क्या एक बेहतर पुस्तकालय है जिसे आप इसके बजाय उपयोग करना पसंद करते हैं?
जवाबों:
BigDecimal
सब तरह से। मैंने कुछ लोगों को अपने स्वयं के Cash
या Money
कक्षाएं बनाने के बारे में सुना है जो मुद्रा के साथ एक नकद मूल्य को अलग करते हैं, लेकिन त्वचा के नीचे यह अभी भी एक है BigDecimal
, शायद साथBigDecimal.ROUND_HALF_EVEN
गोलाई के ।
संपादित करें: जैसा कि डॉन ने अपने उत्तर में उल्लेख किया है , टाइमएंडमनी जैसी खुली खट्टी परियोजनाएं हैं , और डेवलपर्स को पहिया को सुदृढ़ करने से रोकने की कोशिश करने के लिए मैं उनकी सराहना करता हूं, मुझे अभी प्री-अल्फा लाइब्रेरी का उपयोग करने के लिए पर्याप्त आत्मविश्वास नहीं है यह उत्पादन के माहौल में है। इसके अलावा, यदि आप हुड के नीचे खुदाई करते हैं, तो आप देखेंगे कि वे BigDecimal
भी उपयोग करते हैं ।
यह JodaMoney के बारे में जानने के लिए खोज इंजन द्वारा यहां पहुंचने वाले लोगों के लिए उपयोगी हो सकता है: http://www.joda.org/joda-money/ ।
BigDecimal
हुड के नीचे है!
मैं यहां अपनी राय व्यक्त नहीं कर रहा हूं, लेकिन बिगडीकल के खिलाफ काफी अच्छे तर्क हैं कि किसी को शायद बाहर फेंक देना चाहिए:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
एक सुविधाजनक पुस्तकालय जो मैंने पहले चलाया था, वह है जोडा-मनी लाइब्रेरी। इसका एक कार्यान्वयन वास्तव में बिगडेसीमल पर आधारित है। यह ISO-4217 पर आधारित है मुद्राओं के लिए विनिर्देश और एक अनुकूलित मुद्रा सूची (CVS के माध्यम से लोड) का समर्थन कर सकता है।
इस लाइब्रेरी में कम संख्या में ऐसी फाइलें हैं, जिनमें से संशोधनों की आवश्यकता होने पर व्यक्ति जल्दी से जा सकता है। जोडा-मनी अपाचे 2.0 लाइसेंस के तहत प्रकाशित किया जाता है।
यदि आप केवल डॉलर और सेंट का उपयोग कर रहे हैं, तो मैं एक लंबे (2 दशमलव स्थानों पर ऑफसेट) का उपयोग करूंगा। यदि आपको अधिक विस्तार की आवश्यकता है, तो बड़ा दशमलव जाने का रास्ता हो सकता है।
किसी भी तरह से, मैं शायद वर्ग का विस्तार एक .toString () में कर सकता हूं जो सही प्रारूप का उपयोग करता है, और अन्य तरीकों को रखने के लिए एक जगह के रूप में जो ऊपर आ सकता है (यदि लंबे समय तक, गुणा और विभाजन करना दशमलव हो जाएगा 't समायोजित)
इसके अलावा, यदि आप अपने स्वयं के वर्ग और इंटरफ़ेस को परिभाषित करते हैं, तो आप कार्यान्वयन को वसीयत में बदल सकते हैं।
BigDecimal
या अन्य निश्चित बिंदु प्रतिनिधित्व वह है जो आम तौर पर पैसे के लिए आवश्यक होता है।
फ्लोटिंग पॉइंट ( Double
, Float
) निरूपण और परिकलन अक्षम्य हैं, जिससे गलत परिणाम सामने आते हैं।
समय और धन के साथ व्यवहार करते समय आपको इतना सावधान रहना होगा।
जब आप पैसे के साथ काम कर रहे हों, तो मुझे उम्मीद है कि हर किसी को कभी भी फ्लोट या डबल का उपयोग नहीं करना चाहिए।
लेकिन मैं BigDecimal को लेकर अनिश्चित हूं।
ज्यादातर मामलों में अगर आप सिर्फ एक इंट या लंबे समय में सेंट का ट्रैक रखते हैं तो आप ठीक हो जाएंगे। इस तरह आप एक दशमलव स्थान से कभी नहीं निपटते।
जब आप इसे प्रिंट करते हैं तो आप केवल डॉलर प्रदर्शित करते हैं। हमेशा पूर्णांक का उपयोग करके आंतरिक के साथ काम करते हैं। यदि यह विभाजित करने की आवश्यकता है या Math.abs () का उपयोग करने की आवश्यकता है तो यह मुश्किल हो सकता है।
हालाँकि, आप आधा प्रतिशत, या यहाँ तक कि एक प्रतिशत का भी ध्यान रख सकते हैं। मुझे नहीं पता कि ऐसा करने का एक अच्छा तरीका क्या है। आपको बस हज़ारों सेंट से निपटने और लंबे समय तक उपयोग करने की आवश्यकता हो सकती है। या शायद आप BigDecimal का उपयोग करने के लिए मजबूर हो जाएंगे
मैं इस पर और भी बहुत कुछ पढ़ूंगा, लेकिन हर उस व्यक्ति को नजरअंदाज कर दूंगा जो पैसे का प्रतिनिधित्व करने के लिए फ्लोट या डबल का इस्तेमाल करने की बात करने लगता है। वे सिर्फ परेशानी पूछ रहे हैं।
मुझे लगता है कि मेरी सलाह पूरी नहीं हुई है, इसलिए कृपया इसे और अधिक में डालें। आप खतरनाक प्रकारों से निपट रहे हैं!
मनी क्लास बनाना एक रास्ता है। नीचे BigDecimal (या यहां तक कि एक इंट) का उपयोग करना। फिर गोलाई सम्मेलन को परिभाषित करने के लिए मुद्रा वर्ग का उपयोग करना।
दुर्भाग्य से ऑपरेटर ओवरलोडिंग के बिना जावा इस तरह के मूल प्रकारों को बनाने में काफी अप्रिय बनाता है।
एक बेहतर पुस्तकालय है, टिम्डमनी । आईएमओ, यह इन 2 अवधारणाओं का प्रतिनिधित्व करने के लिए जेडीके द्वारा प्रदान की गई पुस्तकालयों से बहुत बेहतर है।
निश्चित रूप से बिगडेसिमल नहीं। गोलाई और प्रस्तुति के लिए बहुत सारे विशेष नियम हैं जिनके बारे में आपको चिंता करनी होगी।
मार्टिन फाउलर मुद्रा राशियों का प्रतिनिधित्व करने के लिए एक समर्पित मनी क्लास के कार्यान्वयन की सिफारिश करते हैं, और यह भी मुद्रा रूपांतरण के लिए नियमों को लागू करता है।
अरे, बिगडेक्मल पर यहां एक बहुत ही दिलचस्प लेख है, और इसका उदाहरण है कि कभी-कभी डबल्स के बजाय इसका उपयोग क्यों किया जाता है। BigDecimal Tutorial ।
जब आप अंततः एक मुद्रा मूल्य प्रदर्शित करते हैं तो आप DecimalFormat वर्ग का उपयोग कर सकते हैं। यह स्थानीयकरण का समर्थन प्रदान करता है और यह बहुत ही एक्स्टेंसिबल है।
मैं मनी क्लास में बिगडेसीमल को इनकैप्सुलेट करूंगा जिसमें एक मुद्रा भी है जैसा कि ऊपर किसी ने उल्लेख किया है। महत्वपूर्ण बात यह है कि आप अत्यधिक मात्रा में यूनिट परीक्षण करते हैं और विशेषकर यदि विभिन्न मुद्राओं के साथ काम कर रहे हों। इसके अलावा यह एक अच्छा विचार है यदि आप एक कंस्ट्रक्शनल कंस्ट्रक्टर जोड़ते हैं जो एक स्ट्रिंग या एक फैक्ट्री विधि लेता है जो ऐसा ही करता है ताकि आप अपने टेस्ट को कुछ इस तरह से लिख सकें:
assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
इसमें हमेशा अड़चनें और विशिष्टताएँ शामिल होती हैं। निम्नलिखित लेख में उल्लिखित सूक्ष्म मुद्दों की सराहना करने के लिए पर्याप्त अनुभव के बिना किसी को भी वास्तविक विश्व वित्तीय डेटा से निपटने से पहले गंभीरता से पुनर्विचार करना चाहिए:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimal शायद ही सही प्रतिनिधित्व या पहेली का एकमात्र टुकड़ा है। कुछ शर्तों को देखते हुए, पूर्णांक के रूप में संग्रहीत सेंट द्वारा समर्थित मनी क्लास का उपयोग करना पर्याप्त हो सकता है और बिगडेसीमल की तुलना में बहुत तेज होगा। हां, इसका अर्थ है कि डॉलर का उपयोग मुद्रा के रूप में होता है और मात्राओं को सीमित करता है, लेकिन ऐसे अवरोध कई उपयोग के मामलों के लिए पूरी तरह से स्वीकार्य हैं और सभी मुद्राओं में वैसे भी गोल और उप-संप्रदायों के लिए विशेष मामले हैं, इसलिए कोई "सार्वभौमिक" समाधान नहीं है।