मैं दशमलव को इंट में कैसे बदलूं?
मैं दशमलव को इंट में कैसे बदलूं?
जवाबों:
का प्रयोग करें Convert.ToInt32
से mscorlib
के रूप में
decimal value = 3.14m;
int n = Convert.ToInt32(value);
MSDN देखें । आप भी इस्तेमाल कर सकते हैं Decimal.ToInt32
। फिर से, MSDN देखें । अंत में, आप एक सीधे कलाकारों के रूप में कर सकते हैं
decimal value = 3.14m;
int n = (int) value;
जो स्पष्ट कास्ट ऑपरेटर का उपयोग करता है। MSDN देखें ।
null
बनाम 0
बनाम ""
) के लिए कुछ आश्चर्यजनक व्यवहार है । जब तक आपको बिल्कुल इसके लचीलेपन की आवश्यकता न हो (यानी डायनामिक रूप से टाइप किए गए परिदृश्यों में) का उपयोग करने की सलाह कभी नहीं
OverflowException
। मेरा मानना है कि @Will यहां एक बेहतर उत्तर प्रदान करता है stackoverflow.com/a/501165/39532
Convert.ToInt32
और Decimal.ToInt32
अलग तरह से व्यवहार करते हैं। MSDN से: Decimal.ToInt32
- वापसी मान दशमलव मान का अभिन्न अंग है; आंशिक अंशों को काट दिया जाता है । Convert.ToInt32
- रिटर्न मान निकटतम 32-बिट हस्ताक्षरित पूर्णांक के लिए गोल है। यदि मान दो पूर्ण संख्याओं के बीच आधा है, तो सम संख्या वापस आ जाती है; अर्थात ४.५ को ४ में बदल दिया जाता है, और ५.५ को
आप नहीं कर सकते।
ठीक है, बेशक आप कर सकते हैं , हालांकि एक int (System.Int32) हर संभव दशमलव मान रखने के लिए पर्याप्त नहीं है।
इसका मतलब है कि यदि आप एक दशमलव कास्ट करते हैं जो int.MaxValue से बड़ा है, तो आप अतिप्रवाह करेंगे, और यदि दशमलव int.MinValue से छोटा है, तो यह कम हो जाएगा।
जब आप ओवरफ्लो करते हैं तो क्या होता है? दो चीजों में से एक। यदि आपका निर्माण अनियंत्रित है (यानी, सीएलआर परवाह नहीं है यदि आप करते हैं), तो आपका आवेदन मूल्य से अधिक / कम होने के बाद भी जारी रहेगा, लेकिन इंट में मूल्य वह नहीं होगा जो आपने अपेक्षित किया था। इससे आंतरायिक कीड़े हो सकते हैं और उन्हें ठीक करना मुश्किल हो सकता है। आप अपने आवेदन को एक अज्ञात स्थिति में समाप्त कर देंगे, जिसके परिणामस्वरूप आपका आवेदन जो भी महत्वपूर्ण डेटा उसके काम को भ्रष्ट कर सकता है। अच्छा नही।
यदि आपकी असेंबली की जाँच की जाती है (गुण-> बिल्ड-> उन्नत-> अंकगणितीय अतिप्रवाह / अंडरफ़्लो या / चेक किए गए कंपाइलर विकल्प की जाँच करें), तो आपका कोड एक अपवाद को तब फेंक देगा जब एक अंडर / ओवरफ़्लो होता है। यह शायद नहीं से बेहतर है; हालाँकि, असेंबली के लिए डिफॉल्ट ओवर / अंडरफ्लो की जांच नहीं करता है।
असली सवाल यह है कि "आप क्या करने की कोशिश कर रहे हैं?" आपकी आवश्यकताओं को जाने बिना, कोई भी आपको यह नहीं बता सकता है कि आपको इस मामले में क्या करना चाहिए , स्पष्ट के अलावा: क्या नहीं है।
यदि आप विशेष रूप से परवाह नहीं करते हैं, तो यहां उत्तर मान्य हैं। हालाँकि, आपको अपनी समझ का संचार करना चाहिए कि अतिप्रवाह हो सकता है और अनचेक ब्लॉक में अपने कास्ट कोड को लपेटने से कोई फर्क नहीं पड़ता
unchecked
{
// do your conversions that may underflow/overflow here
}
इस तरह से आपके पीछे आने वाले लोग समझते हैं कि आप परवाह नहीं करते हैं, और अगर भविष्य में कोई आपके बिल्ड / चेक को बदल देता है, तो आपका कोड अप्रत्याशित रूप से नहीं टूटेगा।
यदि आप सभी करना चाहते हैं तो संख्या के भिन्नात्मक भाग को छोड़ दें, अभिन्न अंग को छोड़कर, आप Math.Truncate का उपयोग कर सकते हैं।
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
int i = (int)d;
आपको नीचे राउंड नंबर देगा।
यदि आप निकटतम सम संख्या (यानी। .5 को राउंड अप करना चाहते हैं) का उपयोग कर सकते हैं
int i = (int)Math.Round(d, MidpointRounding.ToEven);
सामान्य तौर पर आप C # में सभी संख्यात्मक प्रकारों के बीच कास्ट कर सकते हैं। यदि कोई जानकारी नहीं है जो कलाकारों के दौरान खो जाएगी तो आप इसे संक्षेप में कर सकते हैं:
int i = 10;
decimal d = i;
यद्यपि आप अभी भी इसे स्पष्ट रूप से कर सकते हैं यदि आप चाहें तो:
int i = 10;
decimal d = (decimal)i;
हालांकि, यदि आप कलाकारों के माध्यम से जानकारी खोते जा रहे हैं, तो आपको इसे स्पष्ट रूप से करना होगा (यह दिखाने के लिए कि आप जानते हैं कि आप जानकारी खो सकते हैं):
decimal d = 10.5M;
int i = (int)d;
यहाँ आप ".5" खो रहे हैं। यह ठीक हो सकता है, लेकिन आपको इसके बारे में स्पष्ट होना चाहिए और आपको यह दिखाने के लिए एक स्पष्ट कलाकार बनाना होगा कि आपको पता है कि आप जानकारी खो सकते हैं।
ToEven
सांख्यिकीय बहाव को रोकना चाहिए। यदि आप फिर भी आकर्षक वस्तुओं या धन के साथ काम करते हैं, AwayFromZero
तो सही विकल्प लगता है।
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
यहाँ दूसरों के लिए बहुत ही आसान रूपांतरित डेटा प्रकार वेबपेज है। http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
IConvertable
इंटरफ़ेस को लागू करता है, जिसमें एक ToInt32()
सदस्य है।
क्या कॉलिंग System.Decimal.ToInt32()
आपके लिए काम करती है?
फास्ट गोलाई के लिए एक साफ-सुथरी ट्रिक है। अपने दशमलव को इंट में डालने से पहले .5 को जोड़ें।
decimal d = 10.1m;
d += .5m;
int i = (int)d;
अभी भी छोड़ देता है i=10
, लेकिन
decimal d = 10.5m;
d += .5m;
int i = (int)d;
राउंड अप ताकि i=11
।
मैं Math.Round , Math.Floor , Math.Ceiling या Math.Truncate का उपयोग करके स्पष्ट रूप से उपयुक्त के रूप में गोलाई मोड सेट करना पसंद करता हूं ।
ध्यान दें कि वे सभी दशमलव को भी लौटाते हैं - चूंकि दशमलव में एक Int32 की तुलना में मानों की एक बड़ी श्रृंखला है, इसलिए आपको अभी भी डाली (और अतिप्रवाह / अंडरफ्लो की जांच करना होगा)।
checked {
int i = (int)Math.Floor(d);
}
किसी दशमलव को निकटतम पूर्णांक पर गोल करना
decimal a ;
int b = (int)(a + 0.5m);
जब a = 49.9
, तबb = 50
जब a = 49.5
, तबb = 50
जब a = 49.4
, तब b = 49
आदि।
मुझे लगता है कि यदि आपके पास एक बॉक्सिंग दशमलव है (यानी ऑब्जेक्ट प्रकार के अंदर एक दशमलव मान) तो कास्टिंग ऑपरेटर काम नहीं करता है। Convert.ToInt32 (ऑब्जेक्ट के रूप में दशमलव) इस मामले में ठीक काम करता है।
डेटाबेस से IDENTITY / AUTONUMBER मान प्राप्त करते समय यह स्थिति आती है:
SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works
int ID = (int)foo.ExecuteScalar(); // throws InvalidCastException
SELECT SCOPE_IDENTITY()
रिटर्न numeric(38, 0)
जो decimal
.NET द्वारा अनुवादित है । foo.ExecuteScalar()
एक decimal
बॉक्सिंग लौटाता है object
जिसे सीधे नहीं डाला जा सकता है int
। (int)(decimal)foo.ExecuteScalar()
या Convert.ToInt32(foo.ExecuteScalar())
काम करेगा।
ऐसा कोई जवाब नहीं लगता है कि OverflowException / UnderflowException से निपटने के लिए जो एक दशमलव को बदलने की कोशिश कर रहा है जो कि int की सीमा के बाहर है।
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
यह समाधान अधिकतम या न्यूनतम इंट वैल्यू संभव करेगा यदि दशमलव मान इंट रेंज के बाहर है। जब आप मान श्रेणी के अंदर है, तो आप Math.Round, Math.Ceiling या Math.Floor के साथ कुछ राउंडिंग जोड़ना चाहते हैं।