हमारे कोड में हमारे पास एक डबल है जिसे हमें इंट में बदलने की आवश्यकता है।
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