C # में पैसे के लिए उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है?


426

C # में पैसे के लिए उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है?


4
हो सकता है आपको इस पोस्ट के उत्तर उपयोगी लगे।
ntombela

यहां सभी डेटा प्रकारों के लिए एक मानचित्रण है: docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
JohnLBevan

इसके अलावा, यदि डेटा एनोटेशन का उपयोग किया जाता है, तो इसमें शामिल करें using System.ComponentModel.DataAnnotations;... [DataType(DataType.Currency)] msdn.microsoft.com/en-us/library/…
JohnLBevan

जवाबों:


422

जैसा कि यह दशमलव पर वर्णित है :

दशमलव कीवर्ड 128-बिट डेटा प्रकार को इंगित करता है। फ्लोटिंग-पॉइंट प्रकारों की तुलना में, दशमलव प्रकार में अधिक सटीक और एक छोटी सी सीमा होती है, जो वित्तीय और मौद्रिक गणना के लिए उपयुक्त बनाती है ।

आप एक दशमलव का उपयोग इस प्रकार कर सकते हैं:

decimal myMoney = 300.5m;

41
आपको यह बताना चाहिए कि उस लिंक के बारे में क्या महत्वपूर्ण है। अतिरिक्त संदर्भ या विवरण के रूप में लिंक के साथ एक उत्तर अपने आप में काफी अच्छा होना चाहिए। देखें stackoverflow.com/help/how-to-answer
TheRubberDuck

2
तो न्यूनतम लंबाई का उत्तर न्यूनतम लंबाई की टिप्पणी की तुलना में कम अक्षर हो सकता है - दिलचस्प! ऐसा नहीं है कि मुझे ट्रिक / संक्षिप्त उत्तर के साथ कोई समस्या है, खासकर जब यह "गहरी" भी है कि यह आगे की चर्चा के लिए लिंक करता है।
बी क्ले शैनन

3
अद्भुत जवाब, और मुझे नहीं लगता कि इसे और स्पष्टीकरण की आवश्यकता है क्योंकि यह पूरी तरह से सवाल का जवाब देता है। MSDN प्रलेखन का लिंक एक बोनस है जहाँ तक मेरा सवाल है। वाहवाही!
त्रैलसन

@ ली ट्रेवेल, पैसा क्या है (9.0098) प्वाइंट के बाद 4 वर्ण का मतलब है
SAR

114

System.Decimal

दशमलव मान प्रकार दशमलव संख्या को सकारात्मक 79,228,162,514,264,337,593,543,950,335 से नकारात्मक 79,228,162,514,264,337,593,543,950,335 तक दर्शाता है। वित्तीय गणनाओं के लिए दशमलव मान प्रकार उपयुक्त होता है, जिसमें बड़ी संख्या में महत्वपूर्ण अभिन्न और भिन्नात्मक अंकों की आवश्यकता होती है और बिना राउंड-ऑफ त्रुटियों के। दशमलव प्रकार गोलाई की आवश्यकता को समाप्त नहीं करता है। बल्कि, यह गोलाई के कारण त्रुटियों को कम करता है।

मैं zneak द्वारा इस उत्कृष्ट उत्तर को इंगित करना चाहूंगा कि डबल का उपयोग क्यों नहीं किया जाना चाहिए।


68

एंटरप्राइज एप्लिकेशन आर्किटेक्चर के पैटर्न से धन पैटर्न का उपयोग करें ; एक दशमलव के रूप में दशमलव और मुद्रा के रूप में राशि निर्दिष्ट करें।


2
मैं वास्तव में यह सुझाव देने जा रहा था, लेकिन मैं मुद्रा को एक वर्ग बनाता हूं, इसलिए मैं एक विनिमय दर (एक "आधार मुद्रा" के संबंध में, अक्सर अमेरिकी डॉलर [जिसे मैंने 1.00 की विनिमय दर निर्धारित किया है) को परिभाषित कर सकता हूं।)
थॉमस ओवेन्स

5
इस धागे के भविष्य के आगंतुकों (मेरे जैसे) के लिए, अब यह है: nuget.org/packages/Money और यह चट्टानों!
12

आश्चर्य है कि क्या इस तरह का एक संरचना या वर्ग होना चाहिए। एक दशमलव + (इंट) एनम इसे 20 बाइट्स बनाता है। मेरा पैसा अभी भी संरचना पर है।
नवफाल

उस Moneyनगेट में प्रोजेक्ट साइट के लिए एक मृत जीथब लिंक है ... इसलिए डॉक्स नहीं?
जॉर्ज मौअर

इसके साथ समस्या यह है कि यदि आप अपना स्वयं का कार्यान्वयन बना रहे हैं, तो आपको यह पता लगाना होगा कि वास्तव में इसे कैसे बनाए रखना है। और सबसे लोकप्रिय ORM (EF) के पास कस्टम डेटा प्रकारों के लिए कोई समर्थन नहीं है। इसलिए किसी से कहा जाता है कि वास्तव में बहुत गहरे में मातम करने के लिए क्या होना चाहिए एक बहुत ही सीधी बात है।
जॉर्ज मौअर

25

दशमलव। यदि आप डबल चुनते हैं तो आप अपने आप को गोलाई की त्रुटियों के लिए खुला छोड़ रहे हैं


8
@Jess doubleराउंडिंग एरर पेश कर सकता है क्योंकि फ्लोटिंग पॉइंट बिल्कुल सभी नंबरों का प्रतिनिधित्व नहीं कर सकता (जैसे 0.01 फ्लोटिंग पॉइंट में कोई सटीक प्रतिनिधित्व नहीं है)। Decimalदूसरी ओर, वास्तव में संख्याओं का प्रतिनिधित्व करता है । (ट्रेड-ऑफ़ में Decimalफ्लोटिंग पॉइंट की तुलना में एक छोटी रेंज होती है) फ़्लोटिंग पॉइंट आपको * अनजाने * राउंडिंग एरर (उदा 0.01+0.01 != 0.02) दे सकता है। Decimalआपको राउंडिंग एरर दे सकता है, लेकिन केवल तब जब आपने इसके लिए कहा हो (जैसे कि Math.Round(0.01+0.02)शून्य रिटर्न)
इयान बॉयड

2
@IBBdd: मूल्य "$ 1.57" का सटीक प्रतिनिधित्व किया जा सकता है (दोहराव) 157। यदि कोई doubleउचित उपयोग करता है और ध्यान से स्केलिंग और डोमेन-विशिष्ट गोलाई लागू करता है, तो यह पूरी तरह से सटीक हो सकता है। यदि कोई किसी की गोलाई में टेढ़ा है, तो ऐसे decimalपरिणाम प्राप्त कर सकते हैं जो शब्दार्थिक रूप से गलत हैं (जैसे कि यदि कोई एक साथ कई मान जोड़ता है जो कि निकटतम पेनी के लिए माना जाता है, लेकिन वास्तव में पहले उनके आसपास नहीं होता है)। केवल अच्छी बात यह decimalहै कि स्केलिंग अंतर्निहित है।
सुपरकैट

1
@supercat, इस टिप्पणी के बारे में "यदि कोई एक साथ कई मूल्यों को जोड़ता है जो कि निकटतम पेनी के लिए माना जाता है, लेकिन वास्तव में उनके आसपास पहले नहीं होता है", मैं यह नहीं देखता कि एक फ्लोट यह कैसे हल करेगा। यह एक उपयोगकर्ता की त्रुटि है और इसका दशमलव IMHO से कोई लेना-देना नहीं है। मुझे यह बात समझ में नहीं आती, लेकिन मुझे लगता है कि यह गलत है, मुख्यतः क्योंकि इयानबॉय ने यह निर्दिष्ट किया है ... यदि आप इसके लिए पूछें।
सीय

16

दशमलव में एक छोटी सी सीमा होती है, लेकिन अधिक सटीक होती है - इसलिए आप समय के साथ उन सभी पैसे को नहीं खोते हैं!

पूर्ण विवरण यहाँ:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx


13

मनी पैटर्न से सहमत: जब आप दशमलव का उपयोग करते हैं तो मुद्राओं को संभालना बहुत बोझिल होता है।

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

इसके अलावा, एक मुद्रा वर्ग के साथ, अनजाने में अन्य डेटा के साथ पैसा मिलाने का कोई मौका नहीं है।


10

एक अन्य विकल्प (विशेषकर यदि आप स्वयं की कक्षा को रोल कर रहे हैं) एक int या int64 का उपयोग करना है, और "दशमलव बिंदु के दाईं ओर" के रूप में निचले चार अंकों (या संभवतः 2 भी) को नामित करना है। तो "किनारों पर" आपको रास्ते में कुछ "* 10000" और रास्ते में कुछ "/ 10000" की आवश्यकता होगी। यह Microsoft के SQL सर्वर द्वारा उपयोग किया जाने वाला संग्रहण तंत्र है, http://msdn.microsoft.com/en-au/library/ms179882.aspx देखें

इसकी ख़ासियत यह है कि आपके सभी योगों का उपयोग (तेज़) पूर्णांक अंकगणित किया जा सकता है।


7

अधिकांश एप्लिकेशन मैंने उपयोग के साथ काम किए हैं decimal पैसे का प्रतिनिधित्व लिए है। यह इस धारणा पर आधारित है कि एप्लिकेशन का एक से अधिक मुद्रा के साथ संबंध नहीं होगा।

यह धारणा एक और धारणा पर आधारित हो सकती है, कि विभिन्न मुद्राओं वाले अन्य देशों में एप्लिकेशन का उपयोग कभी नहीं किया जाएगा। मैंने ऐसे मामले देखे हैं जो झूठे साबित हुए।

अब उस धारणा को एक नए तरीके से चुनौती दी जा रही है: बिटकॉइन जैसी नई मुद्राएं आम हो रही हैं, और वे किसी भी देश के लिए विशिष्ट नहीं हैं। यह अवास्तविक नहीं है कि सिर्फ एक देश में उपयोग किए जाने वाले एप्लिकेशन को अभी भी कई मुद्राओं का समर्थन करने की आवश्यकता हो सकती है।

कुछ लोग कहेंगे कि केवल पैसे के लिए एक प्रकार का उपयोग करना या बनाना भी "सोना चढ़ाना" है, या ज्ञात आवश्यकताओं से परे अतिरिक्त जटिलता को जोड़ना है। मैं दृढ़ता से असहमत हूँ। जितना अधिक सर्वव्यापी अवधारणा आपके डोमेन के भीतर है, उतना ही महत्वपूर्ण यह है कि सामने वाले सही अमूर्तता का उपयोग करने के लिए एक उचित प्रयास करना। यदि आप जटिलता देखना चाहते हैं, तो उस एप्लिकेशन में काम करने का प्रयास करें जिसका उपयोग किया जाता था decimalऔर अब Currencyहर decimalसंपत्ति के बगल में एक अतिरिक्त संपत्ति है।

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

और यह दशमलव के अलावा कुछ और उपयोग करने के लिए मुश्किल नहीं है। Google "नगेट मनी टाइप" और आप देखेंगे कि कई डेवलपर्स ने इस तरह के सार (मेरे सहित) बनाए हैं। यह आसान है। DateTimeकिसी दिनांक में दिनांक संग्रहीत करने के बजाय इसका उपयोग करना उतना ही आसान है string


5

अपनी खुद की कक्षा बनाएँ। यह अजीब लगता है, लेकिन विभिन्न मुद्राओं को कवर करने के लिए .Net प्रकार अपर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.