2009-06-17 19 views
46

सी # में, मौद्रिक राशि का प्रतिनिधित्व करने के लिए मुझे किस डेटा प्रकार का उपयोग करना चाहिए? दशमलव? फ्लोट? डबल? सटीक, राउंडिंग, आदिसी # में पैसे का प्रतिनिधित्व करने के लिए मुझे किस डेटा प्रकार का उपयोग करना चाहिए?

उत्तर

68

उपयोग System.Decimal:: मैं विचार में ले जाना चाहते

दशमलव मान प्रकार दशमलव से सकारात्मक 79.228.162.514.264.337.593.543.950.335 नकारात्मक 79.228.162.514.264.337.593.543.950.335 के बीच की संख्याएं प्रतिनिधित्व करता है। दशमलव मान प्रकार महत्वपूर्ण अभिन्न और दशमलव अंक की बड़ी संख्या है और कोई दौर बंद त्रुटियों की आवश्यकता होती है वित्तीय गणना के लिए उपयुक्त है। दशमलव प्रकार गोल करने की आवश्यकता को खत्म नहीं करता है। इसके बजाय, यह राउंडिंग के कारण त्रुटियों को कम करता है।

न तो System.Single (float) है और न ही System.Double (double) सटीक पर्याप्त उच्च परिशुद्धता चल त्रुटियों गोलाई बिना बिन्दु संख्या का प्रतिनिधित्व करने में सक्षम हैं।

+10

मैंने इसे ऊपर उठाया है, लेकिन मैं अंतिम दावा के साथ समस्या उठाता हूं। ऐसा नहीं है कि फ्लोट/डबल पर्याप्त सटीक नहीं हैं - यह सिर्फ इतना है कि वे पैसे के लिए अनुचित आधार का उपयोग करते हैं। आपके पास दशमलव से अधिक वास्तविक * सटीक * के साथ 512 बिट फ़्लोटिंग बाइनरी पॉइंट मान हो सकता है - लेकिन यह अभी भी उचित नहीं होगा क्योंकि यह 0.1 मानों के दशमलव मानों का प्रतिनिधित्व नहीं कर सका। –

+0

मेरी गलती - मैंने अपने जवाब में मिश्रित अर्थ। मैंने अपने अंतिम बयान में "सटीक" का अर्थ "गणितीय परिशुद्धता" का अर्थ नहीं दिया बल्कि यह व्यक्त करने के लिए कि एक गोलाकार संख्या (इस उदाहरण में 1) (0.9 99 99_) से "कम सटीक" है जब चर को आवंटित संख्या वास्तव में थी 0.9999_। मेरे हिस्से पर शब्दों की खराब पसंद ... –

+0

हां, यहां तक ​​कि एक फ्लोट _precise_ पर्याप्त है। समस्या तब होती है जब दशमलव से बाइनरी और पीछे परिवर्तित हो जाती है। दो अलग-अलग अड्डों में अपरिमेय संख्याओं के अलग-अलग सेट होते हैं। – Nosredna

3

Decimal वह वही है जिसे आप चाहते हैं।

4

यदि आप SQL का उपयोग कर रहे हैं तो डीबी में दशमलव और धन का उपयोग करें।

2

सी # में, दशमलव प्रकार वास्तव में आधार 10 में सभी गणित और तुलना संचालन के लिए अधिभारित कार्यों के साथ एक संरचना है, इसलिए इसमें कम महत्वपूर्ण गोलियां त्रुटियां होंगी। दूसरी तरफ एक फ्लोट (और डबल) बाइनरी में वैज्ञानिक नोटेशन के समान है। नतीजतन, जब आप आवश्यक परिशुद्धता जानते हैं तो दशमलव प्रकार अधिक सटीक होते हैं।

भागो यह 2 की सटीकता में अंतर को देखने के लिए:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace FloatVsDecimal 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Decimal _decimal = 1.0m; 
      float _float = 1.0f; 
      for (int _i = 0; _i < 5; _i++) 
      { 
       Console.WriteLine("float: {0}, decimal: {1}", 
           _float.ToString("e10"), 
           _decimal.ToString("e10")); 
       _decimal += 0.1m; 
       _float += 0.1f; 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
0

Money Type for the CLR उपयोग पर विचार करें। यह एक कस्टम वैल्यू टाइप (स्ट्रक्चर) है जो मुद्राओं और समस्याओं को हल करने के लिए हैंडल का भी समर्थन करता है।

+0

2 साल पहले कोई रीडमे, दस्तावेज़, और अनमोल पीआरएस ... –

+0

मैं "सी # के माध्यम से अनुकूली कोड" पुस्तक (2014 से) पढ़ रहा था और यह कहता है: "दशमलव प्रकार का उपयोग करने की सलाह नहीं दी जाती है मुद्रा मूल्यों का प्रतिनिधित्व करें (...)। इसके बजाय एक धन (उपरोक्त में उल्लिखित यूआरएल) का उपयोग किया जाना चाहिए। मैं उलझन में था क्योंकि मुझे हमेशा दशमलव का उपयोग करने के लिए कहा गया था। लेखक का तर्क नहीं है कि हमें क्यों नहीं करना चाहिए दशमलव का उपयोग करें। उस पर आधारित और जॉर्ज ने क्या लिखा, मुझे लगता है कि दशमलव जाने का रास्ता है। – Marshall

0

सी # में आपको मौद्रिक मात्रा का प्रतिनिधित्व करने के लिए "दशमलव" लेना चाहिए।

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

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