दशमलव के लिए एक डबल चर कास्ट


96

कैसे एक डाली एक करता है doubleकरने के लिए decimalजो जब मुद्रा विकास कर रही है प्रयोग किया जाता है। कहाँ जाता है M?

decimal dtot = (decimal)(doubleTotal);

जवाबों:


85

आप केवल Mएक संख्यात्मक शाब्दिक के लिए उपयोग करते हैं , जब आप इसे डालते हैं:

decimal dtot = (decimal)doubleTotal;

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


अनुवर्ती प्रश्न के रूप में, स्पष्ट रूपांतरण की आवश्यकता क्यों है? मैंने इसे आज़मा लिया है और मुझे एक त्रुटि मिलती है कि एक डबल को स्पष्ट रूप से एक दशमलव में नहीं डाला जा सकता है, लेकिन क्या एक दशमलव अधिक परिशुद्धता नहीं रखता है? (यानी इंट की तरह एक डबल से कास्टिंग करना निहित हो सकता है।)

4
@Cortana: एक दशमलव की सटीकता अधिक है, लेकिन सीमा छोटी है। एक दशमलव के लिए एक डबल मान सीमा से बाहर हो सकता है। देखें: stackoverflow.com/questions/7817866/…
गुफा

41

Mशाब्दिक प्रत्यय की आवश्यकता के बिना आप इस तरह एक दशमलव में एक डबल कास्ट कर सकते हैं :

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

Mनया शाब्दिक दशमलव मान घोषित करते समय आपको इसका उपयोग करना चाहिए :

decimal dec = 123.45M;

( M123.45 के बिना , एक डबल के रूप में माना जाता है और संकलन नहीं करेगा।)


28

डिफ़ॉल्ट कनवर्ज़न क्लास का उपयोग करें: Convert.ToDecimal(Double)


1
नहीं, क्योंकि यह एक OverflowException डबल Vol_y = (डबल) Decimal.MaxValue + 10E + 28D फेंक देगा; Console.WriteLine ("Convert.ToDecimal (vol_y) =" + Convert.ToDecimal (vol_y));
टॉक्सीन

2
@ToXinE IMHO ज्यादातर मामलों में एक अतिप्रवाह एक गलत तरीके से गलत डेटा बनाने से बेहतर है
11

16
Convert.ToDecimal(the double you are trying to convert);

2
मैंने सीखा है कि कन्वर्ट क्लास C # में एक कास्ट की तुलना में अधिक लचीला और सुरक्षित है।
टॉम

3
"सुरक्षित"? के रूप में जब यह नहीं कर सकते हैं यह एक संकलक त्रुटि के बजाय रन-टाइम पर एक अपवाद फेंकता है? मुझे कई बार ऐसा लगा कि मैं सक्रिय रूप से कन्वर्ट से बचता हूं ...
पीटर रिची

8
@PeterRitchie धागा थोड़ा पुराना है लेकिन यह कहा जाना चाहिए: कन्वर्ट विधि को सीधे कॉल करना अधिक उपयुक्त दृष्टिकोण होगा। शायद मैं सिर्फ एक अनुकूलन सनकी हूं, लेकिन हल करने के लिए एक कम निर्देश एक बोनस है (चूंकि स्पष्ट (प्रकार) कास्ट सिंटैक्स का उपयोग करना सिर्फ एक ऑपरेटर अधिभार है जो कन्वर्ट कॉल करता है)।
माइक जॉनसन

2
@PeterRitchie: एक भाषा-डिजाइन दृष्टिकोण से, यह बेहतर नहीं बल्कि से एक समान किरदार देने से दो रूपांतरण एक विधि का उपयोग करने के लिए एक प्रोग्रामर की आवश्यकता के लिए हो गया होता doubleकरने के लिए decimal, यह देखते हुए कि एक के लिए double(1,000,000.0 / 3.0) की तरह मूल्य एक होगा कुछ मामलों में 333333.333333333D उपज देने वाली "अधिकता" को क्लिप करना चाहते हैं, लेकिन दूसरों के मामलों में कोई भी इसे बनाए रखना चाहेगा, 333333.333333333313931D। केवल "दशमलव में कनवर्ट करें" कहने के बजाय, कोड को यह निर्दिष्ट करना चाहिए कि रूपांतरण कैसे किया जाना चाहिए।
सुपरकैट

2
@supercat जो वास्तव में मेरी पहली टिप्पणी से असंबंधित लगता है क्योंकि उपयोग करने Convert.ToDecimal(double)के लिए समान है (decimal)doubleTotal, सिवाय इसके कि अगर doubleTotalकिसी भिन्न प्रकार को बदल दिया जाए तो आप एक संकलन-समय की त्रुटि से बचेंगे और एक कठिन-टू-रन रन-टाइम त्रुटि का परिचय देंगे क्योंकि एक अलग TODimalimal ओवरराइड कहा जा सकता है। कास्ट ऑपरेटर बहुत अधिक स्पष्ट है ...
पीटर रिची

1

खैर यह एक पुराना प्रश्न है और मैंने यहाँ दिखाए गए कुछ उत्तरों का वास्तव में उपयोग किया है। फिर भी, मेरे विशेष परिदृश्य में यह संभव था कि जिस doubleमूल्य को मैं परिवर्तित करना चाहता decimalथा, वह अक्सर उससे बड़ा था decimal.MaxValue। इसलिए, मैंने अपवादों को संभालने के बजाय यह विस्तार विधि लिखी:

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

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


1
यह निम्नलिखित मामले में विफल होगा डबल _double = (डबल) दशमलव। MaxValue; मैं तुलना सार्वजनिक स्थैतिक दशमलव ToDecimal (इस दोहरे _double) => _double> = (double) दशमलव .axValue में => का उपयोग करने का सुझाव दूंगा दशमलव। maxValue: (दशमलव) _ डबल;
मार्टिन एल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.