2010-10-05 10 views
13

उदाहरण के लिए:डबल अर्थ का उद्देश्य क्या है?

const decimal dollars = 25.50M; 

कारण है कि हम है कि M जोड़ने के लिए है?

क्यों न सिर्फ कार्य करें:

const decimal dollars = 25.50; 

के बाद से यह पहले से ही decimal कहते हैं, यह मतलब है कि 25.50 एक दशमलव है ना?

उत्तर

22

सं

25.50 प्रकार double, नहीं decimal की एक स्टैंडअलोन अभिव्यक्ति है।
कंपाइलर यह नहीं देख पाएगा कि आप इसे decimal चर पर असाइन करने की कोशिश कर रहे हैं और इसे दशमलव के रूप में समझते हैं।

लैम्ब्डा अभिव्यक्तियों, अज्ञात विधियों और सशर्त ऑपरेटर के अलावा, सभी सी # अभिव्यक्तियों का एक निश्चित प्रकार होता है जो संदर्भ पर निर्भर नहीं करता है।

कल्पना करें कि क्या होगा यदि कंपाइलर ने जो किया था उसे किया, और आपने Math.Max(1, 2) कहा।
Math.Max में ओवरलोड हैं जो int, double, और decimal लेते हैं। कौन सा कॉल करेगा?

+0

@slaks: तो एक दशमलव initiliazing की उचित तरीके क्या है? –

+2

उन्होंने 'एम' प्रत्यय के साथ, जिस तरह से किया था। – SLaks

+5

@ जेनी, अगले प्रश्न से आगे निकलने के लिए, 'डबल डी = 1/2' बराबर 0. इस प्रश्न और उत्तर के संदर्भ में क्यों सोचें। –

10

इस स्थिति में समझने के लिए दो महत्वपूर्ण अवधारणाएं हैं।

  1. शाब्दिक मान
  2. अंतर्निहित रूपांतरण

अनिवार्य रूप से क्या आप पूछ रहे हैं कि क्या एक शाब्दिक मूल्य परोक्ष 2 प्रकार के बीच परिवर्तित किया जा सकता है। कुछ मामलों में कंपाइलर वास्तव में आपके लिए ऐसा करेगा जब परिशुद्धता में कोई नुकसान नहीं होगा। उदाहरण के लिए यह लो:

long n = 1000; // Assign an Int32 literal to an Int64. 

यह संभव है क्योंकि एक long (Int64) एक int (Int32) की तुलना में मूल्यों की एक बड़ी रेंज शामिल हैं। आपके विशिष्ट उदाहरण के लिए परिशुद्धता खोना संभव है। decimal और double के लिए यहां बहुत अलग श्रेणियां हैं।

 
Decimal: ±1.0 × 10−28 to ±7.9 × 1028 
Double: ±5.0 × 10−324 to ±1.7 × 10308 

ज्ञान के साथ यह स्पष्ट हो जाता है कि एक अंतर्निहित रूपांतरण एक बुरा विचार क्यों है। यहां अंतर्निहित रूपांतरणों की एक सूची दी गई है जो वर्तमान में सी # कंपाइलर का समर्थन करता है। मैं अत्यधिक अनुशंसा करता हूं कि आप इस विषय पर थोड़ा सा प्रकाश पढ़ लें।

Implicit Numeric Conversions Table

+0

एक दशमलव केवल 8,121.2 तक जा सकता है? यह 7.9 x 1028 है। वाह, यह बहुत अधिक सीमा नहीं है। (कहने का मेरा स्नैप तरीका, मुझे लगता है कि आपने वहां "^" या सुपरस्क्रिप्ट खो दिया है।) – Jay

+0

@Jay - मैं आपकी स्नैप टिप्पणी में एक चतुर वापसी के साथ आने में असफल रहा ... तो चुप रहो! :) – ChaosPandion

3

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

उदाहरण के लिए, एक डबल 25.10 मान को ठीक से स्टोर नहीं कर सकता है, लेकिन दशमलव हो सकता है।

एक डबल ठीक बाइनरी-एन्कोडिंग कारणों के लिए 25.50 मान को ठीक से स्टोर कर सकता है।

Decimal structure

+0

आह हाँ, यह याद रखना महत्वपूर्ण है कि संख्यात्मक डेटा को खोने के दो तरीके हैं। परिमाण और प्रेसिजन। – ChaosPandion

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