मैं C # में एक दशमलव को int में कैसे परिवर्तित करूं?


227

मैं दशमलव को इंट में कैसे बदलूं?


11
यह जानना उपयोगी होगा कि क्या आप निकटतम इंट में चक्कर लगाना चाहते हैं या दशमलव के बाद संख्याओं को छोड़ दें (यानी: हमेशा गोल नीचे)
दीना

128
मैं ईमानदारी से वास्तविक सवालों को नीचा दिखाने की बात नहीं करता। हां, उत्तर Google पर पाया जा सकता है लेकिन क्या यह साइट की गुणवत्ता में सुधार नहीं करेगा अगर लोग हर दूसरे सवाल को बंद कर दें? यह ऐसा नहीं है कि यह प्रश्न स्पैम या कुछ भी है, और मुझे यकीन है कि यह कई नए-कॉमर्स के लिए उपयोगी होगा c #
jay_t55

जवाबों:


268

का प्रयोग करें 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 देखें ।


10
बाहर देखो: कुछ रूपांतरण ( nullबनाम 0बनाम "") के लिए कुछ आश्चर्यजनक व्यवहार है । जब तक आपको बिल्कुल इसके लचीलेपन की आवश्यकता न हो (यानी डायनामिक रूप से टाइप किए गए परिदृश्यों में) का उपयोग करने की सलाह कभी नहीं
दूंगा

1
-1 चूंकि यह दशमलव जैसे मानों के लिए काम नहीं करेगा। MaxValue और दशमलव ।inValue और परिणाम a OverflowException। मेरा मानना ​​है कि @Will यहां एक बेहतर उत्तर प्रदान करता है stackoverflow.com/a/501165/39532
mezoid

8
सावधान रहें, क्योंकि Convert.ToInt32और Decimal.ToInt32अलग तरह से व्यवहार करते हैं। MSDN से: Decimal.ToInt32- वापसी मान दशमलव मान का अभिन्न अंग है; आंशिक अंशों को काट दिया जाता हैConvert.ToInt32- रिटर्न मान निकटतम 32-बिट हस्ताक्षरित पूर्णांक के लिए गोल है। यदि मान दो पूर्ण संख्याओं के बीच आधा है, तो सम संख्या वापस आ जाती है; अर्थात ४.५ को ४ में बदल दिया जाता है, और ५.५ को
६.२ में

67

आप नहीं कर सकते।

ठीक है, बेशक आप कर सकते हैं , हालांकि एक 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));

3
यद्यपि मुझे संदेह है कि वे हुड के नीचे एक ही चीज हैं यदि इनपुट एक दशमलव है, तो मैं Decimal.Truncate का उपयोग करके अधिक सहज महसूस करता हूं। Mathun.runcate की तुलना में, क्योंकि बाद वाला भी युगल को स्वीकार करता है और इस प्रकार संख्याओं को छोटा करने में सक्षम समझा जा सकता है। यह दशमलव 10 का आधार नहीं है, जैसा कि दशमलव के विपरीत है। यह आधार संख्या 10 का सही छंटनी है।
ब्रायन

7
अनियंत्रित संदर्भ दशमलव पर लागू नहीं होते हैं; दशमलव पर संचालन की परवाह किए बिना ओवरफ्लो अपवादों को फेंक देगा।
डेव

46
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" खो रहे हैं। यह ठीक हो सकता है, लेकिन आपको इसके बारे में स्पष्ट होना चाहिए और आपको यह दिखाने के लिए एक स्पष्ट कलाकार बनाना होगा कि आपको पता है कि आप जानकारी खो सकते हैं।


1
आप वास्तव में MidpointRounding.AwayFromZero चाहते हैं, तो आप हमेशा दौर अप मेरे अनुभव नमूना उत्पादन पर यहाँ देख उपरोक्त कोड को आजमाने के आधार पर करना चाहते हैं> * .5: msdn.microsoft.com/en-us/library/...
एलिजा लफ़ग्रेन

@ElijahLofgren यह थोड़े निर्भर करता है: यदि आप आंकड़े कर रहे हैं, तो आपको ToEvenसांख्यिकीय बहाव को रोकना चाहिए। यदि आप फिर भी आकर्षक वस्तुओं या धन के साथ काम करते हैं, AwayFromZeroतो सही विकल्प लगता है।
एमबीएक्स

22
decimal d = 2;
int i = (int) d;

यह ठीक काम करना चाहिए।


एक स्पष्ट रूपांतरण जानकारी के साथ सावधान, खो सकता है।
फेद्र्स

21
दशमलव से इंट में परिवर्तित करते समय, सूचना लगभग हमेशा खो जाएगी लेकिन मेरा मानना ​​है कि यह बिंदु है।
दिनाह


8

System.DecimalIConvertableइंटरफ़ेस को लागू करता है, जिसमें एक ToInt32()सदस्य है।

क्या कॉलिंग System.Decimal.ToInt32()आपके लिए काम करती है?


2
से प्रलेखन : "यह एपीआई .नेट फ्रेमवर्क बुनियादी सुविधाओं का समर्थन करता है और अपने कोड से सीधे इस्तेमाल किया जा करने का इरादा नहीं है।" क्यों नहीं Convert.ToInt32 का उपयोग करें?
एच। वाल्पर

7

फास्ट गोलाई के लिए एक साफ-सुथरी ट्रिक है। अपने दशमलव को इंट में डालने से पहले .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


5
जब Math.Floor और Math.Ceiling वहाँ ऐसा करने से क्यों परेशान है?
बद्रो

उस समय, मैं C # के लिए काफी नया था और किसी कारण से मुझे एहसास नहीं हुआ कि ये कार्य मौजूद थे। यह वास्तव में एक चाल है जिसे मैंने C / C ++ से सीखा है, जहां यह स्पष्ट रूप से अधिक उपयोगी था।
डेडली ब्रैड 42

1
क्या होगा यदि दशमलव मान उदा -9.3 था?
20 अप्रैल को सुपरैट

6

मैं Math.Round , Math.Floor , Math.Ceiling या Math.Truncate का उपयोग करके स्पष्ट रूप से उपयुक्त के रूप में गोलाई मोड सेट करना पसंद करता हूं ।

ध्यान दें कि वे सभी दशमलव को भी लौटाते हैं - चूंकि दशमलव में एक Int32 की तुलना में मानों की एक बड़ी श्रृंखला है, इसलिए आपको अभी भी डाली (और अतिप्रवाह / अंडरफ्लो की जांच करना होगा)।

 checked {
   int i = (int)Math.Floor(d);
 }


6

किसी दशमलव को निकटतम पूर्णांक पर गोल करना

decimal a ;
int b = (int)(a + 0.5m);

जब a = 49.9, तबb = 50

जब a = 49.5, तबb = 50

जब a = 49.4, तब b = 49आदि।


0

मुझे लगता है कि यदि आपके पास एक बॉक्सिंग दशमलव है (यानी ऑब्जेक्ट प्रकार के अंदर एक दशमलव मान) तो कास्टिंग ऑपरेटर काम नहीं करता है। 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

4.3.2 अनबॉक्सिंग रूपांतरण देखें


2
संदर्भ के लिए इसे और जोड़ना: ऐसा इसलिए है क्योंकि आप केवल उसी मूल प्रकार से अनबॉक्स कर सकते हैं। यहाँ SELECT SCOPE_IDENTITY()रिटर्न numeric(38, 0)जो decimal.NET द्वारा अनुवादित है । foo.ExecuteScalar()एक decimalबॉक्सिंग लौटाता है objectजिसे सीधे नहीं डाला जा सकता है int(int)(decimal)foo.ExecuteScalar()या Convert.ToInt32(foo.ExecuteScalar())काम करेगा।
रागित

0

ऐसा कोई जवाब नहीं लगता है कि OverflowException / UnderflowException से निपटने के लिए जो एक दशमलव को बदलने की कोशिश कर रहा है जो कि int की सीमा के बाहर है।

int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));

यह समाधान अधिकतम या न्यूनतम इंट वैल्यू संभव करेगा यदि दशमलव मान इंट रेंज के बाहर है। जब आप मान श्रेणी के अंदर है, तो आप Math.Round, Math.Ceiling या Math.Floor के साथ कुछ राउंडिंग जोड़ना चाहते हैं।

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