2011-11-21 7 views
37

मैंने मुद्राओं के लिए BigDecimal का उपयोग करने के लिए जावा साइट पर पढ़ा है। http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.htmlजावा में मुद्रा हेरफेर के लिए किस राउंडिंग मोड का उपयोग किया जाना चाहिए?

लेकिन हमें किस गोल करने के तरीके का उपयोग करना चाहिए? जो सबसे उपयुक्त है और सबसे व्यापक रूप से हमें

उत्तर

-8

आपको मुद्राओं के लिए दशमलव प्रकार का कभी भी उपयोग नहीं करना चाहिए। एक पूर्णांक प्रकार का प्रयोग करें। यह फ्लोट

से संबंधित राउंडिंग त्रुटि से बचने की सटीकता खरीद को बनाए रखता है, जब राशि प्रदर्शित होती है तो गैर-अभिन्न अंग प्राप्त करने के लिए उचित कारक द्वारा विभाजित करें।

+7

असल में, अगर सही ढंग से उपयोग किया जाता है तो बिगडेसिमल पूरी तरह से सुरक्षित और सटीक होते हैं। बस 'डबल' या 'फ्लोट' का उपयोग न करें। –

+1

+1: अधिकांश निवेश बैंकों को छोड़कर @ एआमोस 'डबल', कभी-कभी int/long का उपयोग करते हैं। सी/सी ++ का उपयोग करने वाले esp, यह दशमलव प्रकार में निर्मित नहीं है। –

+1

@ पीटर: एक और संकेत है कि वे वास्तव में नहीं जानते कि वे क्या कर रहे हैं। सी ++ के लिए बहुत सी मुद्रा/निश्चित बिंदु पुस्तकालय हैं और खुद को लिखना आसान है। –

9

आमतौर पर आप का उपयोग करेंगे "आधा" गोलाई, इसलिए जैसे:

myBigDecimal.setScale(2, RoundingMode.HALF_UP); 

इस तरह, आप दौर दो दशमलव स्थानों (जो सबसे मुद्राओं का उपयोग करते है, जैसे डॉलर और सेंट के, स्पष्ट रूप से देखते हैं जाएगा अपवाद), और आप मूल्यों को गोल करेंगे जैसे कि आधा प्रतिशत या अधिक दौर में होगा जबकि आधा प्रतिशत से भी कम हो जाएगा। अधिक जानकारी के लिए the javadoc देखें।

42

कोई "सही" मोड नहीं है, यह व्यवसाय के मामले पर निर्भर करता है। उदाहरण:

  • वार्षिक करों की गणना करते समय, अंशों को अक्सर काट दिया जाता है (RoundingMode.FLOOR)।
  • बोनस की गणना करते समय, आप हमेशा ग्राहक (RoundingMode.CEILING) के पक्ष में गोल करना चाहते हैं।
  • बिल पर करों के लिए, आप आमतौर पर HALF_UP
  • जटिल वित्तीय सिमुलेशन करते समय, आप बिल्कुल गोल नहीं करना चाहते हैं।

documentation of RoundingMode में कई उदाहरण हैं कि विभिन्न तरीके कैसे काम करते हैं।

एक बेहतर उत्तर पाने के लिए, आपको हमें यह बताना होगा कि आप क्या हासिल करना चाहते हैं।

उस ने कहा, BigDecimal जावा में उपयोग करने के लिए सही प्रकार है क्योंकि यह किसी भी परिशुद्धता को संरक्षित रख सकता है और यह आपको अपने मामले के लिए सबसे उपयुक्त राउंडिंग मोड चुनने देता है।

15

अधिकांश समय BigDecimal मुद्राओं के लिए एकमात्र वैध विकल्प है। लेकिन गोल करने की रणनीति की पसंद स्पष्ट नहीं है।

डिफ़ॉल्ट HALF_EVEN है जो एक अच्छा विकल्प होता है। इस एल्गोरिदम को बैंकरों के गोलाकार के रूप में जाना जाता है (चर्चा here देखें)।

एक और आम रणनीति HALF_UP है जो अधिक सहज है लेकिन इसमें कुछ और खराब सांख्यिकीय विशेषताएं हैं।

यह भी ध्यान दें कि कई बार (विशेष रूप से बैंकिंग और बीमा में) राउंडिंग रणनीति व्यावसायिक आवश्यकताओं द्वारा निर्धारित की जाएगी, अक्सर विभिन्न उपयोग-मामलों के लिए अलग होती है।

+0

आपको यह जोड़ना चाहिए कि HALF_EVEN अक्षम है। – Jus12

4

वित्तीय अनुप्रयोगों के लिए ROUND_HALF_EVEN सबसे आम गोल मोड है। वह मोड पूर्वाग्रह से बचाता है। लेकिन प्रदर्शन के लिए आपको NumberFormat क्लास का उपयोग करना चाहिए। यह कक्षा विभिन्न मुद्राओं में रकम के लिए स्थानीयकरण के मुद्दों का ख्याल रखेगी।लेकिन NumberFormat केवल primitives स्वीकार करता है। तो अगर आप ट्रांसफॉर्मेशन में डबल में सटीकता परिवर्तन को स्वीकार कर सकते हैं तो अंतिम का उपयोग करें।

संबंधित मुद्दे