C # में पैसे के लिए उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
C # में पैसे के लिए उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
जवाबों:
जैसा कि यह दशमलव पर वर्णित है :
दशमलव कीवर्ड 128-बिट डेटा प्रकार को इंगित करता है। फ्लोटिंग-पॉइंट प्रकारों की तुलना में, दशमलव प्रकार में अधिक सटीक और एक छोटी सी सीमा होती है, जो वित्तीय और मौद्रिक गणना के लिए उपयुक्त बनाती है ।
आप एक दशमलव का उपयोग इस प्रकार कर सकते हैं:
decimal myMoney = 300.5m;
दशमलव मान प्रकार दशमलव संख्या को सकारात्मक 79,228,162,514,264,337,593,543,950,335 से नकारात्मक 79,228,162,514,264,337,593,543,950,335 तक दर्शाता है। वित्तीय गणनाओं के लिए दशमलव मान प्रकार उपयुक्त होता है, जिसमें बड़ी संख्या में महत्वपूर्ण अभिन्न और भिन्नात्मक अंकों की आवश्यकता होती है और बिना राउंड-ऑफ त्रुटियों के। दशमलव प्रकार गोलाई की आवश्यकता को समाप्त नहीं करता है। बल्कि, यह गोलाई के कारण त्रुटियों को कम करता है।
मैं zneak द्वारा इस उत्कृष्ट उत्तर को इंगित करना चाहूंगा कि डबल का उपयोग क्यों नहीं किया जाना चाहिए।
एंटरप्राइज एप्लिकेशन आर्किटेक्चर के पैटर्न से धन पैटर्न का उपयोग करें ; एक दशमलव के रूप में दशमलव और मुद्रा के रूप में राशि निर्दिष्ट करें।
Money
नगेट में प्रोजेक्ट साइट के लिए एक मृत जीथब लिंक है ... इसलिए डॉक्स नहीं?
दशमलव। यदि आप डबल चुनते हैं तो आप अपने आप को गोलाई की त्रुटियों के लिए खुला छोड़ रहे हैं
double
राउंडिंग एरर पेश कर सकता है क्योंकि फ्लोटिंग पॉइंट बिल्कुल सभी नंबरों का प्रतिनिधित्व नहीं कर सकता (जैसे 0.01 फ्लोटिंग पॉइंट में कोई सटीक प्रतिनिधित्व नहीं है)। Decimal
दूसरी ओर, वास्तव में संख्याओं का प्रतिनिधित्व करता है । (ट्रेड-ऑफ़ में Decimal
फ्लोटिंग पॉइंट की तुलना में एक छोटी रेंज होती है) फ़्लोटिंग पॉइंट आपको * अनजाने * राउंडिंग एरर (उदा 0.01+0.01 != 0.02
) दे सकता है। Decimal
आपको राउंडिंग एरर दे सकता है, लेकिन केवल तब जब आपने इसके लिए कहा हो (जैसे कि Math.Round(0.01+0.02)
शून्य रिटर्न)
double
उचित उपयोग करता है और ध्यान से स्केलिंग और डोमेन-विशिष्ट गोलाई लागू करता है, तो यह पूरी तरह से सटीक हो सकता है। यदि कोई किसी की गोलाई में टेढ़ा है, तो ऐसे decimal
परिणाम प्राप्त कर सकते हैं जो शब्दार्थिक रूप से गलत हैं (जैसे कि यदि कोई एक साथ कई मान जोड़ता है जो कि निकटतम पेनी के लिए माना जाता है, लेकिन वास्तव में पहले उनके आसपास नहीं होता है)। केवल अच्छी बात यह decimal
है कि स्केलिंग अंतर्निहित है।
दशमलव में एक छोटी सी सीमा होती है, लेकिन अधिक सटीक होती है - इसलिए आप समय के साथ उन सभी पैसे को नहीं खोते हैं!
पूर्ण विवरण यहाँ:
मनी पैटर्न से सहमत: जब आप दशमलव का उपयोग करते हैं तो मुद्राओं को संभालना बहुत बोझिल होता है।
यदि आप एक मुद्रा-वर्ग बनाते हैं, तो आप एक सही ToString () - विधि, पार्सिंग मूल्यों का अधिक नियंत्रण और डिवीजनों के बेहतर नियंत्रण सहित, पैसे से संबंधित सभी तर्क रख सकते हैं।
इसके अलावा, एक मुद्रा वर्ग के साथ, अनजाने में अन्य डेटा के साथ पैसा मिलाने का कोई मौका नहीं है।
एक अन्य विकल्प (विशेषकर यदि आप स्वयं की कक्षा को रोल कर रहे हैं) एक int या int64 का उपयोग करना है, और "दशमलव बिंदु के दाईं ओर" के रूप में निचले चार अंकों (या संभवतः 2 भी) को नामित करना है। तो "किनारों पर" आपको रास्ते में कुछ "* 10000" और रास्ते में कुछ "/ 10000" की आवश्यकता होगी। यह Microsoft के SQL सर्वर द्वारा उपयोग किया जाने वाला संग्रहण तंत्र है, http://msdn.microsoft.com/en-au/library/ms179882.aspx देखें
इसकी ख़ासियत यह है कि आपके सभी योगों का उपयोग (तेज़) पूर्णांक अंकगणित किया जा सकता है।
अधिकांश एप्लिकेशन मैंने उपयोग के साथ काम किए हैं decimal
पैसे का प्रतिनिधित्व लिए है। यह इस धारणा पर आधारित है कि एप्लिकेशन का एक से अधिक मुद्रा के साथ संबंध नहीं होगा।
यह धारणा एक और धारणा पर आधारित हो सकती है, कि विभिन्न मुद्राओं वाले अन्य देशों में एप्लिकेशन का उपयोग कभी नहीं किया जाएगा। मैंने ऐसे मामले देखे हैं जो झूठे साबित हुए।
अब उस धारणा को एक नए तरीके से चुनौती दी जा रही है: बिटकॉइन जैसी नई मुद्राएं आम हो रही हैं, और वे किसी भी देश के लिए विशिष्ट नहीं हैं। यह अवास्तविक नहीं है कि सिर्फ एक देश में उपयोग किए जाने वाले एप्लिकेशन को अभी भी कई मुद्राओं का समर्थन करने की आवश्यकता हो सकती है।
कुछ लोग कहेंगे कि केवल पैसे के लिए एक प्रकार का उपयोग करना या बनाना भी "सोना चढ़ाना" है, या ज्ञात आवश्यकताओं से परे अतिरिक्त जटिलता को जोड़ना है। मैं दृढ़ता से असहमत हूँ। जितना अधिक सर्वव्यापी अवधारणा आपके डोमेन के भीतर है, उतना ही महत्वपूर्ण यह है कि सामने वाले सही अमूर्तता का उपयोग करने के लिए एक उचित प्रयास करना। यदि आप जटिलता देखना चाहते हैं, तो उस एप्लिकेशन में काम करने का प्रयास करें जिसका उपयोग किया जाता था decimal
और अब Currency
हर decimal
संपत्ति के बगल में एक अतिरिक्त संपत्ति है।
यदि आप गलत अमूर्तता का उपयोग करते हैं, तो इसे बाद में प्रतिस्थापित करना सौ गुना अधिक काम होगा। इसका मतलब है कि संभावित रूप से मौजूदा कोड में दोषों को शुरू करना, और सबसे अच्छी बात यह है कि उन दोषों में संभवतः धन की मात्रा, पैसे के साथ लेनदेन या धन के साथ कुछ भी शामिल होगा।
और यह दशमलव के अलावा कुछ और उपयोग करने के लिए मुश्किल नहीं है। Google "नगेट मनी टाइप" और आप देखेंगे कि कई डेवलपर्स ने इस तरह के सार (मेरे सहित) बनाए हैं। यह आसान है। DateTime
किसी दिनांक में दिनांक संग्रहीत करने के बजाय इसका उपयोग करना उतना ही आसान है string
।
अपनी खुद की कक्षा बनाएँ। यह अजीब लगता है, लेकिन विभिन्न मुद्राओं को कवर करने के लिए .Net प्रकार अपर्याप्त है।