हमारे कोड में हमारे पास एक डबल है जिसे हमें इंट में बदलने की आवश्यकता है।
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
क्या कोई मुझे समझा सकता है क्यों i1 != i2?
परिणाम जो मुझे मिलता है वह है: i1 = 9और i2 = 8।
हमारे कोड में हमारे पास एक डबल है जिसे हमें इंट में बदलने की आवश्यकता है।
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
क्या कोई मुझे समझा सकता है क्यों i1 != i2?
परिणाम जो मुझे मिलता है वह है: i1 = 9और i2 = 8।
जवाबों:
क्योंकि Convert.ToInt32गोल:
रिटर्न मान: निकटतम 32-बिट हस्ताक्षरित पूर्णांक के लिए गोल। यदि मान दो पूर्ण संख्याओं के बीच आधा है, तो सम संख्या वापस आ जाती है; यही है, 4.5 को 4 में बदल दिया जाता है, और 5.5 को 6 में बदल दिया जाता है।
... जबकि कलाकारों ने छंटनी की :
जब आप एक डबल या फ्लोट मान से अभिन्न प्रकार में परिवर्तित करते हैं, तो मूल्य छोटा हो जाता है।
अपडेट: अतिरिक्त मतभेदों के लिए नीचे जेपी स्टिग नीलसन की टिप्पणी देखें (जो कि वास्तव में खेल में नहीं आता है यदि scoreवास्तविक संख्या है जैसा कि यहां है)।
scoreथे 8.5बजाय 8.6। मैंने उद्धरण शामिल करने के लिए उत्तर को अपडेट किया। इनपुट के लिए धन्यवाद।
scoreहै NaNया एक अनन्तता या परिमित लेकिन बाहर की सीमा Int32है, तो Convert.ToInt32एक अपवाद फेंक देते हैं। कास्ट वापस आ जाएगा int, लेकिन आप जानते हैं कि कौन सा (मेरे कार्यान्वयन में है Int32.MinValue) क्योंकि आप uncheckedसंदर्भ में हैं। (क्या आपको checkedसंदर्भ में होना चाहिए , कलाकारों को इन मामलों में एक अपवाद के रूप में फेंक दिया जाएगा।)
Doubleटाइप नंबर 10000000000.6(दस बिलियन पॉइंट सिक्स) एक "वास्तविक" नंबर है। intउस पर एक कास्ट का उपयोग करना एक अजीब परिणाम देगा (जब तक कि आप checkedसंदर्भ में नहीं हैं, लेकिन आप शायद नहीं हैं)।
दशमलव बिंदु के बाद कास्टिंग कुछ भी अनदेखा कर देगा, इसलिए 8.6 8 हो जाता है।
Convert.ToInt32(8.6) यह सुनिश्चित करने का सुरक्षित तरीका है कि आपका डबल निकटतम पूर्णांक तक गोल हो जाए, इस मामले में 9।
दिए गए उदाहरण में आपका दशमलव 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
ToInt32 के चक्कर। इंट को कास्टिंग केवल गैर-पूर्णांक घटक को दूर फेंकता है।
Math.Truncate(score)से अधिक स्पष्ट रूप से व्यक्त इरादा है(int)score