सी # में एक डबल करने के लिए परिवर्तित


103

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

double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;

क्या कोई मुझे समझा सकता है क्यों i1 != i2?

परिणाम जो मुझे मिलता है वह है: i1 = 9और i2 = 8


5
Math.Truncate(score)से अधिक स्पष्ट रूप से व्यक्त इरादा है(int)score
Lu55

3
लेकिन Math.Truncate एक डबल या दशमलव लौटाता है, एक इंट
सर्जियोसेट

जवाबों:


165

क्योंकि Convert.ToInt32गोल:

रिटर्न मान: निकटतम 32-बिट हस्ताक्षरित पूर्णांक के लिए गोल। यदि मान दो पूर्ण संख्याओं के बीच आधा है, तो सम संख्या वापस आ जाती है; यही है, 4.5 को 4 में बदल दिया जाता है, और 5.5 को 6 में बदल दिया जाता है।

... जबकि कलाकारों ने छंटनी की :

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

अपडेट: अतिरिक्त मतभेदों के लिए नीचे जेपी स्टिग नीलसन की टिप्पणी देखें (जो कि वास्तव में खेल में नहीं आता है यदि scoreवास्तविक संख्या है जैसा कि यहां है)।


6
आपका लिंक वास्तव में इसे सबसे अच्छा समझाता है, और इसके रूप में सरल नहीं है बनाम बनाम ट्रंकटेट: प्रकार: System.Int32 मान, निकटतम 32-बिट हस्ताक्षरित पूर्णांक के लिए गोल। यदि मान दो पूर्ण संख्याओं के बीच आधा है, तो सम संख्या वापस आ जाती है; अर्थात ४.५ को ४ में बदल दिया जाता है, और ५.५ को ६ में बदल दिया जाता है
इरीकोसग

@ericosg: हां, यह अंतर मुखौटा होता अगर scoreथे 8.5बजाय 8.6। मैंने उद्धरण शामिल करने के लिए उत्तर को अपडेट किया। इनपुट के लिए धन्यवाद।
जॉन

5
और अगर scoreहै NaNया एक अनन्तता या परिमित लेकिन बाहर की सीमा Int32है, तो Convert.ToInt32एक अपवाद फेंक देते हैं। कास्ट वापस आ जाएगा int, लेकिन आप जानते हैं कि कौन सा (मेरे कार्यान्वयन में है Int32.MinValue) क्योंकि आप uncheckedसंदर्भ में हैं। (क्या आपको checkedसंदर्भ में होना चाहिए , कलाकारों को इन मामलों में एक अपवाद के रूप में फेंक दिया जाएगा।)
जेपी स्टिग नीलसन

@JeppeStigNielsen: इनपुट के लिए धन्यवाद, मैंने इसका उल्लेख करने के लिए उत्तर भी अपडेट किया है।
जॉन

अच्छा लगा। लेकिन मुझे लगता है कि Doubleटाइप नंबर 10000000000.6(दस बिलियन पॉइंट सिक्स) एक "वास्तविक" नंबर है। intउस पर एक कास्ट का उपयोग करना एक अजीब परिणाम देगा (जब तक कि आप checkedसंदर्भ में नहीं हैं, लेकिन आप शायद नहीं हैं)।
जेपी स्टिग नीलसन

13

दशमलव बिंदु के बाद कास्टिंग कुछ भी अनदेखा कर देगा, इसलिए 8.6 8 हो जाता है।

Convert.ToInt32(8.6) यह सुनिश्चित करने का सुरक्षित तरीका है कि आपका डबल निकटतम पूर्णांक तक गोल हो जाए, इस मामले में 9।


1
बोनस सवाल - अगर डबल का मान इंट में धकेलने के लिए बहुत बड़ा है तो क्या होगा ? यानी अगर यह int.MAX_VAL से अधिक है ?
कोनराड विल्टरनस्ट

1
@KonradViltersten एक अपवाद मान या तो बहुत बड़ा था या एक Int32 के लिए बहुत छोटा था।
वम्सी

11

आप अपने दोहरे और कलाकारों को गोल कर सकते हैं:

(int)Math.Round(myDouble);

4
सवाल अब यह था कि कैसे बनाया जाए i1 == i2। सवाल यह था कि वे समान क्यों नहीं हैं। Downvoted।
एडम

5

दिए गए उदाहरण में आपका दशमलव 8.6 है । अगर यह 8.5 या 9.5 था, तो i1 == i2 का कथन सही था। वास्तव में यह 8.5 के लिए सच होता, और 9.5 के लिए गलत होता।

स्पष्टीकरण:

दशमलव भाग के बावजूद, दूसरा कथन, int i2 = (int)scoreदशमलव भाग को छोड़ देगा और बस आपको पूर्णांक भाग लौटा देगा। काफी खतरनाक काम करना है, क्योंकि डेटा हानि हो सकती है।

अब, पहले बयान के लिए, दो चीजें हो सकती हैं। यदि दशमलव भाग 5 है, अर्थात यह आधा रास्ता है, तो एक निर्णय किया जाना है। हम ऊपर या नीचे गोल करते हैं? C # में, Convert class बैंकर की गोलाई को लागू करता है। गहरी व्याख्या के लिए यह उत्तर देखें । सीधे शब्दों में कहें, यदि संख्या सम है, तो गोल नीचे, यदि संख्या विषम है, तो गोल करें।

उदाहरण पर विचार करें:

        double score = 8.5;
        int i1 = Convert.ToInt32(score); // 8
        int i2 = (int)score;             // 8

        score += 1;
        i1 = Convert.ToInt32(score);     // 10
        i2 = (int)score;                 // 9

2

ToInt32 के चक्कर। इंट को कास्टिंग केवल गैर-पूर्णांक घटक को दूर फेंकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.