हमने हाल ही में एक प्रणाली लागू की है जिसमें कई मुद्राओं में मूल्यों को संभालने और उनके बीच बदलने की आवश्यकता है, और कुछ चीजों को कठिन तरीके से समझ लिया है।
कभी पैसे के लिए फर्श का उपयोग करने वालों का उपयोग करें
फ्लोटिंग पॉइंट अंकगणित में अशुद्धि का परिचय दिया जाता है, जिस पर तब तक ध्यान नहीं दिया जा सकता, जब तक कि उन्होंने कुछ खराब न कर दिया हो। सभी मानों को पूर्णांक या निश्चित-दशमलव प्रकार के रूप में संग्रहीत किया जाना चाहिए, और यदि आप एक निश्चित-दशमलव प्रकार का उपयोग करना चुनते हैं, तो सुनिश्चित करें कि आप ठीक से समझते हैं कि यह प्रकार हुड के नीचे क्या करता है (यानी, क्या यह आंतरिक रूप से पूर्णांक या फ्लोटिंग बिंदु का उपयोग करता है प्रकार)।
जब आपको गणना या रूपांतरण करने की आवश्यकता हो:
- मूल्यों को फ्लोटिंग पॉइंट में बदलें
- नए मान की गणना करें
- संख्या को गोल करें और इसे एक पूर्णांक में बदलें
चरण 3 में एक पूर्णांक संख्या में एक फ्लोटिंग पॉइंट संख्या को परिवर्तित करते समय, बस इसे मत डालें - इसे गोल करने के लिए गणित फ़ंक्शन का उपयोग करें। यह आमतौर पर होगा round
, हालांकि विशेष मामलों में यह floor
या हो सकता है ceil
। अंतर को जानें और ध्यान से चुनें।
मान के साथ संख्या का प्रकार संग्रहीत करें
यह आपके लिए उतना महत्वपूर्ण नहीं हो सकता है यदि आप केवल एक मुद्रा को संभाल रहे हैं, लेकिन कई मुद्राओं को संभालने में यह हमारे लिए महत्वपूर्ण था। हमने मुद्रा के लिए 3-वर्ण कोड का उपयोग किया, जैसे कि USD, GBP, JPY, EUR, आदि।
स्थिति के आधार पर, यह स्टोर करने में भी मददगार हो सकता है:
- कर के पहले या बाद में संख्या है (या कर की दर क्या थी)
- क्या संख्या रूपांतरण का परिणाम है (और इसे किससे रूपांतरित किया गया था)
उन संख्याओं की सटीकता सीमा जानें, जिनसे आप निपट रहे हैं
वास्तविक मूल्यों के लिए, आप मुद्रा की सबसे छोटी इकाई के समान सटीक होना चाहते हैं। इसका मतलब यह है कि आपके पास एक प्रतिशत से भी छोटा कोई मूल्य नहीं है, एक पैसा, एक येन, एक फेन आदि, बिना किसी कारण के उच्च सटीकता के साथ मूल्यों को संग्रहीत न करें।
आंतरिक रूप से, आप छोटे मूल्यों से निपटने के लिए चुन सकते हैं, जिस स्थिति में यह एक अलग प्रकार का मुद्रा मूल्य है । सुनिश्चित करें कि आपका कोड जानता है कि कौन सा है और उन्हें मिलाया नहीं जाता है। यहां तक कि फ्लोटिंग पॉइंट वैल्यू का उपयोग करने से बचें।
उन सभी नियमों को एक साथ जोड़ते हुए, हमने निम्नलिखित नियमों पर निर्णय लिया। रनिंग कोड में, मुद्राओं को सबसे छोटी इकाई के लिए पूर्णांक का उपयोग करके संग्रहीत किया जाता है।
class Currency {
String code; // eg "USD"
int value; // eg 2500
boolean converted;
}
class Price {
Currency grossValue;
Currency netValue;
Tax taxRate;
}
डेटाबेस में, मानों को निम्न प्रारूप में एक स्ट्रिंग के रूप में संग्रहीत किया जाता है:
USD:2500
यह $ 25.00 का मूल्य संग्रहीत करता है। हम ऐसा केवल इसलिए कर पाए क्योंकि मुद्राओं से संबंधित कोड को डेटाबेस लेयर के भीतर होने की आवश्यकता नहीं है, इसलिए सभी मानों को पहले मेमोरी में परिवर्तित किया जा सकता है। अन्य स्थितियों में कोई संदेह नहीं है कि अन्य समाधानों के लिए खुद को उधार देना होगा।
और अगर मैं इसे पहले स्पष्ट नहीं कर पाया, तो फ्लोट का उपयोग न करें!