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




floating-point double (14)

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

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


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



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

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

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

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

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


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

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

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

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

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

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

कुछ उदाहरण:

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

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

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

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

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


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

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

मेरा मतलब

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

OverflowException फेंकता है।

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

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

और

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

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

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

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

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

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


जैसा कि उल्लेख किया गया था, इंटीजर, पूरी संख्या हैं। वे बिंदु को कुछ नहीं स्टोर कर सकते हैं, जैसे .7, .42, और .007। यदि आपको उन नंबरों को स्टोर करने की आवश्यकता है जो पूर्ण संख्या नहीं हैं, तो आपको एक अलग प्रकार के चर की आवश्यकता है। आप डबल प्रकार या फ्लोट प्रकार का उपयोग कर सकते हैं। आप इन प्रकार के चर को बिल्कुल उसी तरह सेट करते हैं: शब्द int का उपयोग करने के बजाय, आप double या float टाइप करते हैं। इस कदर:

float myFloat;
double myDouble;

( float "फ़्लोटिंग प्वाइंट" के लिए छोटा है, और इसका मतलब केवल अंत में एक बिंदु के साथ एक संख्या है।)

दोनों के बीच का अंतर उन संख्याओं के आकार में है जो वे पकड़ सकते हैं। float , आपके नंबर में 7 अंक हो सकते हैं। double एस के लिए, आपके पास 16 अंक हो सकते हैं। अधिक सटीक होने के लिए, यहां आधिकारिक आकार है:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

float 32-बिट संख्या है, और double 64-बिट संख्या है।

कोड प्राप्त करने के लिए अपने नए बटन को डबल क्लिक करें। अपने बटन कोड में निम्नलिखित तीन पंक्तियां जोड़ें:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

अपना प्रोग्राम रोकें और कोडिंग विंडो पर वापस आएं। इस लाइन को बदलें:

myDouble = 0.007;
myDouble = 12345678.1234567;

अपना प्रोग्राम चलाएं और अपना डबल बटन क्लिक करें। संदेश बॉक्स सही ढंग से संख्या प्रदर्शित करता है। अंत में एक और नंबर जोड़ें, और सी # फिर से ऊपर या नीचे जाएगा। नैतिक है यदि आप सटीकता चाहते हैं, तो गोल करने से सावधान रहें!


इनमें से प्रत्येक के बीच मुख्य अंतर सटीक है।

float 32-bit संख्या है, double 64-bit संख्या है और decimal 128-bit संख्या है।


यह मेरे लिए एक दिलचस्प धागा रहा है, आज के रूप में, हमारे पास एक छोटी सी छोटी सी बग है, जो 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 उन्हें शून्य पर सेट कर देगा।

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


फ्लोट ~ ± 1.5 x 10-45 से ± 3.4 x 1038 -------- 7 आंकड़े
डबल ~ ± 5.0 x 10-324 से ± 1.7 x 10308 ------ 15 या 16 आंकड़े
दशमलव ~ ± 1.0 x 10-28 से ± 7.9 x 1028 -------- 28 या 2 9 आंकड़े


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

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

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

10001.10010110011

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

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

12345.65789

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

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

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

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

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


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

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

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

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

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

दशमलव दशमलव प्रारूप की सटीकता के भीतर 100% सटीक रूप से किसी भी संख्या का प्रतिनिधित्व कर सकते हैं, जबकि फ्लोट और डबल, सटीक रूप से सभी संख्याओं का प्रतिनिधित्व नहीं कर सकते हैं, यहां तक ​​कि संख्याएं जो उनके संबंधित प्रारूप परिशुद्धता में हैं।

दशमलव

वित्तीय अनुप्रयोगों या वैज्ञानिक गणनाओं के मामले में, दशमलव प्रकारों का उपयोग करना बेहतर होता है क्योंकि यह आपको उच्च स्तर की सटीकता देता है और गोल करने वाली त्रुटियों से बचने में आसान होता है

दोहरा

पैसे को संभालने के अलावा, डबल प्रकार शायद वास्तविक मूल्यों के लिए सबसे सामान्य रूप से उपयोग किए जाने वाले डेटा प्रकार होते हैं।

फ्लोट

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





decimal