दशमलव संख्या के पूरे भाग को प्राप्त करने का सर्वोत्तम तरीका


90

दशमलव के पूरे संख्या भाग को वापस करने का सबसे अच्छा तरीका क्या है (c # में)? (यह बहुत बड़ी संख्या के लिए काम करना है जो एक इंट में फिट नहीं हो सकता है)।

GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324

इसका उद्देश्य यह है: मैं db में एक दशमलव (30,4) फ़ील्ड में सम्मिलित कर रहा हूं, और यह सुनिश्चित करना चाहता हूं कि मैं फ़ील्ड के लिए बहुत लंबा नंबर डालने की कोशिश न करूं। दशमलव की पूरी संख्या भाग की लंबाई निर्धारित करना इस ऑपरेशन का हिस्सा है।


आपको इंट भाग नहीं मिल सकता है; आप पूरे नंबर का हिस्सा प्राप्त कर सकते हैं और आंशिक भाग को खोद सकते हैं। एक दशमलव का संपूर्ण संख्या भाग आसानी से एक अंतर्प्रवाह कर सकता है और या तो फेंक सकता है या चारों ओर लपेट सकता है, चुपचाप आपके कोड को मार सकता है।

1
खैर, इसीलिए यह सवाल उतना सरल नहीं है जितना लगता है। मुझे इसकी आवश्यकता है कि मैं बड़ी संख्या में मज़बूती से काम करूँ क्योंकि यह छोटी संख्या के लिए है। हालांकि, "इंट" की तुलना में "पूरी संख्या" अधिक सटीक है - मैं ऊपर फिर से लिखूंगा।
याकोव एलिस

जवाबों:


213

वैसे, लोग (int) Decimal.MaxValue ओवरफ्लो करेंगे। आप दशमलव के "int" भाग को प्राप्त नहीं कर सकते क्योंकि दशमलव को int बॉक्स में डालने के लिए बहुत बड़ा है। बस जाँच की गई ... इसका बहुत लंबा (Int64) के लिए भी बड़ा।

यदि आप डॉट के LEFT के लिए एक दशमलव मान चाहते हैं, तो आपको यह करने की आवश्यकता है:

Math.Truncate(number)

और मान को इस रूप में लौटाएं ... एक DECIMAL या एक DOUBLE।

संपादित करें: Truncate निश्चित रूप से सही कार्य है!


तो परिणाम दशमलव या डबल है कि बिंदु के बाद कभी भी कुछ नहीं होगा लेकिन परिणाम को "int" (दशमलव स्थानों के बिना) के रूप में संग्रहीत करने के लिए निर्मित नहीं है जो थोड़ा लंगड़ा लगता है?
Coops

@CodeBlend: सटीक खोने की इच्छा के आसपास चौखटे डिजाइन करने के लिए बहुत कुछ नहीं है।

@CodeBlend: आप अभी भी सटीक खो देंगे क्योंकि आप किसी संख्या के दशमलव मानों को काट रहे हैं। सुनिश्चित नहीं हैं कि आप क्या प्राप्त कर रहे हैं।

यकीन नहीं है कि यह काम करेगा या नहीं। क्योंकि Math.Truncate (-5.99999999999999999) रिटर्न -6.0 मेरे लिए ... !!
भारत मोरी

@ भरत मोरी: ऐसा लगता है कि -5.9999999999999999, ट्रंकट से पहले -6.0 तक गोल है। प्रत्यय "एम" के साथ प्रयास करें और यह काम करेगा। Math.Truncate (-5.99999999999999999m) -5 देता है।
हेनरी


4

आप क्या कर रहे हैं पर निर्भर करता है।

उदाहरण के लिए:

//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6

या

//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7

डिफॉल्ट हमेशा पूर्व होता है, जो आश्चर्यचकित कर सकता है लेकिन बहुत अच्छा अर्थ देता है

आपकी स्पष्ट कास्ट करेगा:

int intPart = (int)343564564.5
// intPart will be 343564564

int intPart = (int)343564565.5
// intPart will be 343564566

जिस तरह से आपने प्रश्न का उत्तर दिया है, ऐसा लगता है कि यह वह नहीं है जो आप चाहते हैं - आप इसे हर बार फ़्लोर करना चाहते हैं।

मुझे क्या करना होगा:

Math.Floor(Math.Abs(number));

अपने आकार की भी जांच करें decimal- वे काफी बड़े हो सकते हैं, इसलिए आपको एक का उपयोग करने की आवश्यकता हो सकती है long


(लॉन्ग) डेसीमल।मैक्वल ओवरफ्लो।

उचित बिंदु - मुझे लगता है कि क्यों Math.Truncate (दशमलव) दशमलव लौटाता है।
कीथ

C # में, कास्टिंग इंट टू राउंड नहीं है, इसलिए (int) 0.6f 0 होगा, और (int) 343564565.5 5 में समाप्त होगा, 6 नहीं। यहाँ कोशिश करें: repl.it/repls/LuxuriousCheerfulsistributeddatabase
sschmidTU

0

आपको बस इसे डालने की जरूरत है, जैसे:

int intPart = (int)343564564.4342

यदि आप अभी भी बाद की गणनाओं में एक दशमलव के रूप में इसका उपयोग करना चाहते हैं, तो Math.Truncate (या संभवतः Math.Floor यदि आप नकारात्मक संख्याओं के लिए एक निश्चित व्यवहार चाहते हैं) वह फ़ंक्शन है जिसे आप चाहते हैं।


5
यह गलत गलत गलत है। यदि परिणाम एक इंट 32 से अधिक हो सकता है, तो यह या तो एक अपवाद फेंक देगा या (और भी बदतर !!!) चुपचाप अतिप्रवाह और वापस चारों ओर लपेट देगा, आपको इसके बारे में जानने के बिना भी पूरी तरह से गलत परिणाम देगा।

2
नहीं, यह गलत नहीं है । यह बहुत बड़े दशमलव / अस्थायी बिंदु मानों के लिए मान्य नहीं है, लेकिन अधिकांश स्थितियों के लिए यह पूरी तरह से ठीक है। कोडिंग करते समय संख्या बहुत कम होने के लिए विवश होती है, इसलिए यह समस्या नहीं है। इसके अलावा, मैंने एक Math.Truncate समाधान प्रदान किया जो सभी मूल्यों के लिए काम करता है।
Noldorin

2
मैं देख रहा हूँ कि तुम मुझ पर क्यों पिस रहे हो। तथ्य यह है कि आपका उत्तर गलत है। आप उसे बता रहे हैं कि इस पर ब्रेक न लें, क्योंकि अरे, बहुत सारे नंबर छोटे हैं। यह एक मूर्खतापूर्ण जोखिम है। आपको अपना उत्तर संपादित करना चाहिए और सब कुछ हटा देना चाहिए लेकिन Math.Trcate को इसके एकमात्र सही भाग के रूप में देखें।

1
आप जानते हैं कि वे ASSUME के ​​बारे में क्या कहते हैं। इसके अलावा, आपकी धारणा विशेष रूप से भयानक है। क्या वह भड़काऊ है? मुझे लगता है कि आप ऐसा कह सकते हैं। आप यह भी कह सकते हैं कि किसी को कुछ मूर्खतापूर्ण बताने के लिए जो उन्हें परेशान करेगा क्योंकि सड़क भड़काऊ है, साथ ही अगर वह फ्लैट से बाहर नहीं है।

1
वास्तव में यह गलत होगा यदि मैं एक भ्रामक उत्तर देना चाहता हूं। जैसा भी था, मैं बस मदद करने की कोशिश कर रहा था। अगर मैं थोड़ी गलतफहमी का दोषी हूं या सवाल की पूरी तरह से सराहना नहीं कर रहा हूं, तो यह काफी उचित है - यह कोई अपराध नहीं है। तो अब हम बहस क्यों कर रहे हैं? हम सभी सहमत हैं कि ट्रंकट सही उत्तर है।
नोल्डोरिन

0

मूल्य और उसके आंशिक भाग के मूल्य को अलग करने का बहुत आसान तरीका है।

double  d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");

s आंशिक भाग = 5 है और
मैं पूर्णांक = 3 के रूप में मूल्य है


1
ऊपर उत्तर देखें। यह काम नहीं (int)Decimal.MaxValueकरेगा क्योंकि अतिप्रवाह होगा।
याकोव एलिस

0

मुझे आशा है कि आपकी मदद करेंगे।

/// <summary>
/// Get the integer part of any decimal number passed trough a string 
/// </summary>
/// <param name="decimalNumber">String passed</param>
/// <returns>teh integer part , 0 in case of error</returns>
private int GetIntPart(String decimalNumber)
{
    if(!Decimal.TryParse(decimalNumber, NumberStyles.Any , new CultureInfo("en-US"), out decimal dn))
    {
        MessageBox.Show("String " + decimalNumber + " is not in corret format", "GetIntPart", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return default(int);
    } 

    return Convert.ToInt32(Decimal.Truncate(dn));
}

-2
   Public Function getWholeNumber(number As Decimal) As Integer
    Dim round = Math.Round(number, 0)
    If round > number Then
        Return round - 1
    Else
        Return round
    End If
End Function

1
स्वीकृत उत्तर - आठ साल से अधिक पहले पोस्ट किया गया था - बताता है कि यह उत्तर गलत क्यों है। की सीमा decimalइससे कहीं अधिक है int। इसके अलावा, यह एक VB सवाल नहीं है।
जो फेरेल

@JoeFarrell - यदि आपको लगता है कि उत्तर गलत है, तो आप केवल प्रभाव के लिए एक टिप्पणी छोड़ने के अलावा इसे डाउनवोट करने पर विचार कर सकते हैं। हालांकि, इसे ध्वजांकित न करें (ऐसा नहीं है कि मैं कह रहा हूं कि आपके पास है)। यह प्रश्न का उत्तर देने का प्रयास है। यह गलत भाषा में हो सकता है, वीबी में भी गलत हो सकता है, लेकिन यह एक प्रयास है। उदाहरण के लिए, " जब कोई उत्तर गलत प्रश्न का उत्तर देता है, तो क्या वह उत्तर नहीं है? "।
वाई हा ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.