.NET में दशमलव, फ्लोट और डबल के बीच का अंतर?




floating-point double (12)

.NET में decimal , float और double बीच क्या अंतर है?

इनमें से किसी एक का उपयोग कब होगा?

https://code.i-harness.com


  1. डबल और फ्लोट को दोनों संकलन और रन टाइम पर अपवाद के बिना पूर्णांक शून्य द्वारा विभाजित किया जा सकता है।
  2. दशमलव को पूर्णांक शून्य से विभाजित नहीं किया जा सकता है। यदि आप ऐसा करते हैं तो संकलन हमेशा असफल हो जाएगा।

इन सभी प्रकारों के साथ समस्या यह है कि एक निश्चित अपर्याप्तता घटती है और यह समस्या निम्न उदाहरणों जैसे छोटे दशमलव संख्याओं के साथ हो सकती है

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

प्रश्न: बीएलओआर परिवर्तनीय में कौन सा मूल्य होता है?

उत्तर: 32 बिट मशीन बीएलओवर पर सच है !!!

यदि मैं डबल से दशमलव को प्रतिस्थापित करता हूं, तो बीएलओआर में गलत होता है जो कि अच्छा जवाब है।

दो बार, समस्या यह है कि fMean-fDelta = 1.09999999999 जो 1.1 से कम है।

सावधानी: मुझे लगता है कि एक ही समस्या निश्चित रूप से अन्य संख्या के लिए मौजूद हो सकती है क्योंकि दशमलव केवल उच्च परिशुद्धता के साथ एक दोगुना है और परिशुद्धता हमेशा एक सीमा है।

वास्तव में, डबल, फ्लोट और डेसिमल कोबोल में बिनरी दशमलव के अनुरूप है!

यह खेदजनक है कि COBOL में लागू अन्य संख्यात्मक प्रकार .Net में मौजूद नहीं हैं। उन लोगों के लिए जो COBOL नहीं जानते हैं, संख्यात्मक प्रकार के बाद COBOL में मौजूद हैं

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

किसी ने इसका उल्लेख नहीं किया है

डिफ़ॉल्ट सेटिंग्स में, फ्लोट्स (सिस्टम। सिग्नल) और युगल (सिस्टम। डबल) कभी भी ओवरफ्लो चेकिंग का उपयोग नहीं करेंगे जबकि दशमलव (सिस्टम। डीसीमल) हमेशा ओवरफ्लो चेकिंग का उपयोग करेगा।

मेरा मतलब

decimal myNumber = decimal.MaxValue;
myNumber += 1;

OverflowException फेंकता है।

लेकिन ये नहीं करते हैं:

float myNumber = float.MaxValue;
myNumber += 1;

और

double myNumber = double.MaxValue;
myNumber += 1;

गेम और एम्बेडेड सिस्टम जैसे अनुप्रयोगों के लिए जहां स्मृति और प्रदर्शन दोनों महत्वपूर्ण हैं, फ्लोट आमतौर पर संख्यात्मक प्रकार का विकल्प होता है क्योंकि यह तेज़ और आधा आकार होता है। इंटीजर पसंद का हथियार होता था, लेकिन फ्लोटिंग पॉइंट प्रदर्शन ने आधुनिक प्रोसेसर में पूर्णांक को पीछे छोड़ दिया है। दशमलव सही है!


दशमलव संरचना को सटीक रूप से वित्तीय गणनाओं के लिए तैयार किया जाता है, जो सटीकता की आवश्यकता होती है, जो अपेक्षाकृत असहिष्णुता के असहिष्णु हैं। वैज्ञानिक अनुप्रयोगों के लिए दशमलव पर्याप्त नहीं हैं, हालांकि, कई कारणों से:

  • भौतिक समस्या या आर्टिफैक्ट को मापने की व्यावहारिक सीमाओं की वजह से कई वैज्ञानिक गणनाओं में परिशुद्धता का एक निश्चित नुकसान स्वीकार्य है। वित्त में परिशुद्धता का नुकसान स्वीकार्य नहीं है।
  • दशमलव अधिकतर (अधिक) फ्लोट से अधिक धीमी है और अधिकांश परिचालनों के लिए दोगुनी है, मुख्य रूप से क्योंकि फ्लोटिंग पॉइंट ऑपरेशंस बाइनरी में किए जाते हैं, जबकि दशमलव 10 आधार में किया जाता है (यानी फ्लोट्स और युगल एफपीयू हार्डवेयर द्वारा प्रबंधित किए जाते हैं, जैसे एमएमएक्स / एसएसई , जबकि सॉफ्टवेयर में decimals की गणना की जाती है)।
  • इस तथ्य के बावजूद कि यह परिशुद्धता के अधिक अंकों का समर्थन करता है, दशमलव के मुकाबले दशमलव की तुलना में एक अस्वीकार्य रूप से छोटी मान सीमा है। इसलिए, कई वैज्ञानिक मूल्यों का प्रतिनिधित्व करने के लिए दशमलव का उपयोग नहीं किया जा सकता है।

दशमलव, डबल, और फ़्लोट वैरिएबल प्रकार वे मूल्यों को संग्रहीत करने के तरीके से भिन्न होते हैं। प्रेसिजन मुख्य अंतर है जहां फ्लोट एक एकल परिशुद्धता (32 बिट) फ्लोटिंग पॉइंट डेटा प्रकार है, डबल एक डबल परिशुद्धता (64 बिट) फ्लोटिंग पॉइंट डेटा प्रकार है और दशमलव 128-बिट फ़्लोटिंग पॉइंट डेटा प्रकार है।

फ़्लोट - 32 बिट (7 अंक)

डबल - 64 बिट (15-16 अंक)

दशमलव - 128 बिट (28-29 महत्वपूर्ण अंक)

इसके बारे में अधिक ... दशमलव, फ्लोट और डबल के बीच का अंतर


परिशुद्धता के 7 अंक तैरें

double के परिशुद्धता के लगभग 15 अंक हैं

decimal के परिशुद्धता के लगभग 28 अंक हैं

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

मैंने पाया यह दिलचस्प है। फ़्लोटिंग-पॉइंट अंकगणितीय के बारे में प्रत्येक कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए


प्रेसिजन मुख्य अंतर है।

Float - 7 अंक (32 बिट)

Double -15-16 अंक (64 बिट)

Decimal -28-29 महत्वपूर्ण अंक (128 बिट)

दशमलव के पास बहुत अधिक सटीकता होती है और आमतौर पर वित्तीय अनुप्रयोगों के भीतर उपयोग की जाती है जिसके लिए उच्च स्तर की सटीकता की आवश्यकता होती है। डबल / फ्लोट की तुलना में दशमलव बहुत धीमे होते हैं (कुछ परीक्षणों में 20X गुना तक)।

दशमलव और फ़्लोट / डबल्स की गणना बिना किसी कलाकार के की जा सकती है जबकि फ़्लोट्स और डबल्स कर सकते हैं। दशमलव भी एन्कोडिंग या पिछला शून्य की अनुमति देता है।

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

परिणाम :

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333

मैं अन्य उत्तरों और टिप्पणियों में पहले से ही बहुत अच्छी (और कुछ बुरी) जानकारी दोहराई नहीं जाएगी, लेकिन मैं आपके अनुवर्ती प्रश्न का उत्तर एक टिप के साथ दूंगा:

इनमें से किसी एक का उपयोग कब होगा?

गिनती मानों के लिए दशमलव का प्रयोग करें

मापा मानों के लिए फ्लोट / डबल का प्रयोग करें

कुछ उदाहरण:

  • पैसा (क्या हम पैसे गिनते हैं या पैसे मापते हैं?)

  • दूरी (क्या हम दूरी या माप दूरी की गणना करते हैं? *)

  • स्कोर (क्या हम स्कोर गिनते हैं या स्कोर मापते हैं?)

हम हमेशा पैसे की गिनती करते हैं और इसे कभी मापना नहीं चाहिए। हम आमतौर पर दूरी मापते हैं। हम अक्सर अंक गिनते हैं।

* कुछ मामलों में, मैं नाममात्र दूरी कहूंगा, हम वास्तव में दूरी 'गिनती' करना चाहते हैं। उदाहरण के लिए, शायद हम देश के संकेतों से निपट रहे हैं जो शहरों को दूरी दिखाते हैं, और हम जानते हैं कि उन दूरीओं में कभी भी एक से अधिक दशमलव अंक (xxx.x किमी) नहीं होते हैं।


यह मेरे लिए एक दिलचस्प धागा रहा है, आज के रूप में, हमारे पास एक छोटी सी छोटी सी बग है, जो decimal बारे में एक float से कम परिशुद्धता रखते हैं।

हमारे सी # कोड में, हम एक्सेल स्प्रेडशीट से संख्यात्मक मान पढ़ रहे हैं, उन्हें decimal में परिवर्तित कर रहे हैं, फिर SQL सर्वर डेटाबेस में सहेजने के लिए इस decimal को किसी सेवा पर वापस भेज रहे हैं।

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

अब, हमारे लगभग सभी एक्सेल मूल्यों के लिए, यह खूबसूरती से काम करता है। लेकिन कुछ के लिए, decimal.TryParse का उपयोग करते हुए, बहुत छोटे एक्सेल मान decimal.TryParse ने मूल्य को पूरी तरह से खो दिया। ऐसा एक उदाहरण है

  • सेलवैल = 0.00006317592

  • दशमलव। ट्राईपर्स (सेलवैल्यू। टॉस्ट्रिंग (), आउट मान); // 0 वापस आ जाएगा

समाधान, विचित्र रूप से, एक्सेल मानों को एक double में परिवर्तित करना था, और उसके बाद decimal :

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    double valueDouble = 0;
    double.TryParse(cellValue.ToString(), out valueDouble);
    decimal value = (decimal) valueDouble;
    …
}

हालांकि decimal मुकाबले double की सटीकता कम है, लेकिन वास्तव में यह सुनिश्चित किया जाता है कि छोटी संख्याएं अभी भी पहचानी जाएंगी। किसी कारण से, double.TryParsedouble.TryParse वास्तव में ऐसी छोटी संख्याएं पुनर्प्राप्त करने में सक्षम था, जबकि decimal.TryParse उन्हें शून्य पर सेट कर देगा।

अजीब। बहुत अजीब।


float और double फ्लोटिंग बाइनरी पॉइंट प्रकार हैं । दूसरे शब्दों में, वे इस तरह की संख्या का प्रतिनिधित्व करते हैं:

10001.10010110011

द्विआधारी संख्या और द्विआधारी बिंदु का स्थान दोनों मूल्य के भीतर एन्कोड किए गए हैं।

decimal एक फ़्लोटिंग दशमलव बिंदु प्रकार है । दूसरे शब्दों में, वे इस तरह की संख्या का प्रतिनिधित्व करते हैं:

12345.65789

दोबारा, दशमलव बिंदु की संख्या और स्थान दोनों मान के भीतर एन्कोड किए गए हैं - यही कारण है कि decimal को निश्चित बिंदु प्रकार के बजाय अभी भी एक फ़्लोटिंग पॉइंट प्रकार बनाता है।

ध्यान देने योग्य महत्वपूर्ण बात यह है कि मनुष्यों को दशमलव रूप में गैर-पूर्णांक का प्रतिनिधित्व करने के लिए उपयोग किया जाता है, और दशमलव परिणामों में सटीक परिणाम की उम्मीद होती है; सभी दशमलव संख्याएं बाइनरी फ्लोटिंग पॉइंट - 0.1 में बिल्कुल प्रतिनिधित्व योग्य नहीं हैं, उदाहरण के लिए - यदि आप बाइनरी फ्लोटिंग पॉइंट मान का उपयोग करते हैं तो आपको वास्तव में 0.1 का अनुमान लग जाएगा। फ़्लोटिंग दशमलव बिंदु का उपयोग करते समय भी आपको अनुमान लगाए जाएंगे - उदाहरण के लिए 1 से 3 को विभाजित करने का नतीजा बिल्कुल प्रदर्शित नहीं किया जा सकता है।

किसके लिए उपयोग करना है:

  • उन मानों के लिए जो "स्वाभाविक रूप से सटीक दशमलव" हैं, decimal का उपयोग करना अच्छा है। यह आमतौर पर इंसानों द्वारा आविष्कार की जाने वाली किसी भी अवधारणा के लिए उपयुक्त होता है: वित्तीय मूल्य सबसे स्पष्ट उदाहरण हैं, लेकिन अन्य भी हैं। उदाहरण के लिए, डाइवर्स या आइस स्केटिंगर्स को दिए गए स्कोर पर विचार करें।

  • उन मूल्यों के लिए जो प्रकृति के अधिक कलाकृतियों हैं जिन्हें वास्तव में वैसे भी मापा जा सकता है, float / double अधिक उपयुक्त हैं। उदाहरण के लिए, इस डेटा में वैज्ञानिक डेटा का प्रतिनिधित्व किया जाएगा। यहां, मूल मान प्रारंभ करने के लिए "दशमलव रूप से सटीक" नहीं होंगे, इसलिए अपेक्षित परिणामों के लिए "दशमलव सटीकता" बनाए रखना महत्वपूर्ण नहीं है। फ़्लोटिंग बाइनरी पॉइंट प्रकार दशमलव के मुकाबले काम करने के लिए बहुत तेज हैं।






decimal