दशमलव भाग को डबल से प्राप्त करें


85

मैं पूर्णांक के रूप में दशमलव डॉट के बाद नंबर प्राप्त करना चाहता हूं। उदाहरण के लिए, 1.05 से केवल 05 या 2.50 से केवल 50 नहीं 0.50


15
2.50 सिर्फ 2.5 है। मुझे लगता है कि आप तार की बात कर रहे हैं।
— टिम शाल्टर

3
क्या आप हमेशा दशमलव स्थान के बाद पहले दो अंक लौटा रहे हैं? है इनपुट एक decimal, float, string, ...?
— ग्रेग

3
अगली बार के लिए, यूज़ेज का एक उदाहरण गुणवत्ता के उत्तर प्राप्त करने की दिशा में एक लंबा रास्ता तय करता है।
— tmesser

हाँ केवल towo अंक, इनपुट दशमलव है
— user1095549

4
C # डेवलपमेंट टीम को शर्मिंदा होना चाहिए (और कार्रवाई करनी चाहिए) कि इस बहुत ही सामान्य ऑपरेशन में एक भी Math.function नहीं है जैसे Math.DecimalPart (double x) या कुछ और। वहाँ बहुत ज्यादा है "क्या आपने यह कोशिश की, क्या आपने उस बारे में सोचा" कुछ के लिए हम में से कई को अक्सर करने की आवश्यकता होती है।
— दार्शनिक

जवाबों:


-21

अद्यतन उत्तर

यहां मैं उसी के लिए 3 दृष्टिकोण दे रहा हूं।

[1] गणित समाधान का उपयोग कर Math.Truncate

 var float_number = 12.345;
 var result = float_number - Math.Truncate(float_number);

// इनपुट: 1.05
// आउटपुट: "0.050000000000000044"

// इनपुट: 10.2
// आउटपुट: 0.19999999999999929

यदि यह वह परिणाम नहीं है जो आप उम्मीद कर रहे हैं, तो आपको परिणाम को उस रूप में बदलना होगा जो आप चाहते हैं (लेकिन आप फिर से कुछ स्ट्रिंग जोड़तोड़ कर सकते हैं।)

[2] गुणक का उपयोग करना [जो N की शक्ति से १० है (जैसे १०³ या १० using) जहां N दशमलव दशमलव की संख्या है]

       // multiplier is " 10 to the power of 'N'" where 'N' is the number 
       // of decimal places
       int multiplier = 1000;  
       double double_value = 12.345;
       int double_result = (int)((double_value - (int)double_value) * multiplier);

// आउटपुट 345

यदि दशमलव स्थानों की संख्या निश्चित नहीं है, तो यह दृष्टिकोण समस्याएं पैदा कर सकता है।

[३] "रेगुलर एक्सप्रेशंस (REGEX)" का उपयोग करते हुए

स्ट्रिंग के साथ समाधान लिखते समय हमें बहुत सावधान रहना चाहिए। यह कुछ मामलों को छोड़कर बेहतर नहीं होगा ।

यदि आप दशमलव स्थानों के साथ कुछ स्ट्रिंग ऑपरेशन करने जा रहे हैं, तो यह बेहतर होगा

    string input_decimal_number = "1.50";
    var regex = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+");
    if (regex.IsMatch(input_decimal_number))
    {
        string decimal_places = regex.Match(input_decimal_number).Value;
    }

// इनपुट: "1.05"
// आउटपुट: "05"

// इनपुट: "2.50"
// आउटपुट: "50"

// इनपुट: "0.0550"
// आउटपुट: "0550"

आप Regex के बारे में और जानकारी http://www.regexr.com/ पर प्राप्त कर सकते हैं


ToString () से सावधान रहें क्योंकि यह पूरे नंबरों के लिए कोई दशमलव भाग नहीं लौटाएगा, यदि MyValue 3 है, MyValue.ToString () "3" वापस आ जाएगा तो स्प्लिट ('।') [1] फेंक देगा। स्पष्ट रूप से उन दशमलव स्थानों की संख्या पर प्रारूप निर्दिष्ट करने पर विचार करें जिनकी आपको आवश्यकता है: MyValue.ToString ("F2")। स्प्लिट ('' ') [1]
— एलेक्स बेयेंसन

7
यह समाधान इस पृष्ठ पर किसी भी अन्य समाधान की तुलना में परिमाण धीरज के दो आदेश हैं, और मेरे स्वयं के उत्तर की तुलना में परिमाण धीमे के चार आदेश हैं।
— tmesser

1
यह समाधान संस्कृति-विशिष्ट है। उदाहरण के लिए, रूसी और अंग्रेजी-यूएस में अलग-अलग दशमलव विभाजक हैं (कॉमा और डॉट इसी)। तो यह कोड अन्य संस्कृतियों की सेटिंग में विफल हो जाएगा।
— यूरी शकटुला

2
यह समाधान उस पर विभाजित होता है ., जो हमेशा दशमलव विभाजक नहीं होता (यानी, यूरोप में दशमलव विभाजक होता है ,)। आपको CultureInfo.Invariantइसे अंतर्राष्ट्रीय बनाने के लिए जोड़ना होगा। हालांकि यह सिर्फ उपयोग करने के लिए आसान है x - Math.Truncate(x)और आप उस परिणाम पर जादू करते हैं।
— हाबिल १

3
@Kiquenet क्योंकि यह 7 वां संशोधन है। यह मूल जवाब था: stackoverflow.com/revisions/19374418/1
— मैनड्रेड रेडलविमर

199

सबसे अच्छा तरीका है:

var floatNumber = 12.5523;

var x = floatNumber - Math.Truncate(floatNumber);

परिणाम आप अपनी पसंद के अनुसार बदल सकते हैं


10
यह स्वीकार्य उत्तर होना चाहिए, एक मैथ के प्रश्न का एक मैथ सॉल्यूशन, जो बिना किसी छेड़छाड़ के स्ट्रिंग
— थिकनेस के

20
मुझे लगता है कि इस समाधान में एक "समस्या" है। यदि फ्लोटनंबर "10.2" था, तो चर x "0.19999999999999929" जैसा कुछ होगा। यहां तक ​​कि अगर यह उम्मीद के मुताबिक काम करता है, तो परिणाम "0.2" होगा और "2" नहीं।
— Dherik

4
@ धरिक फ्लोट और डबल वैल्यू में हमेशा पिछले कुछ दशमलव स्थानों में घटाव के तहत छोटी त्रुटियां होती हैं। आपको उन पर गौर नहीं करना चाहिए। यदि आपको वास्तव में उस प्रकार की परिशुद्धता की आवश्यकता है, तो आपको दशमलव प्रकार का उपयोग करना चाहिए। यदि आप दशमलव पर स्विच नहीं कर सकते (या बस नहीं करना चाहते हैं), तो आपको किसी भी तरह अपेक्षित सटीकता का ध्यान रखना चाहिए और तुलनात्मक कार्यों में इसका हिसाब रखना चाहिए। मैं आमतौर पर 4 दशमलव स्थानों का उपयोग करता हूं, लेकिन इसके अपवाद भी हो सकते हैं।
— दार्शनिक

से msdn.microsoft.com/en-us/library/... : "क्योंकि कुछ नंबर, वास्तव में आंशिक द्विआधारी मूल्यों के रूप में नहीं दर्शाया जा सकता फ्लोटिंग प्वाइंट संख्या कर सकते हैं केवल अनुमानित वास्तविक संख्या"
— philologon

1
अंतिम टिप्पणी: Math.Truncate का उपयोग इस तरह की स्थिति के लिए गणित पुस्तकालय के लेखक का इरादा था। @ मातरई का उत्तर स्वीकार किया जाना चाहिए।
— दार्शनिक

81
var decPlaces = (int)(((decimal)number % 1) * 100);

यह मान लेता है कि आपकी संख्या में केवल दो दशमलव स्थान हैं।


1
(318.40d % 1) * 100आउटपुट 39.9999999999977, आप राउंडिंग एरर पाने के लिए कास्टिंग का उपयोग कर सकते हैं:var decPlaces = (int)(((decimal)number % 1) * 100);
— orad

@ नॉरड गुड कॉल वहाँ - फ़्लोटिंग पॉइंट नंबरों में हमेशा ये कम अशुद्धि होती है, इसलिए लगातार व्यवहार को सुनिश्चित करने के लिए कास्टिंग करना बहुत विवेकपूर्ण है। मैं अपने उत्तर को अपडेट करूंगा, हालांकि मैटरई अभी भी तकनीकी रूप से सही है।
— tmesser

27

'Math.Truncate' दृष्टिकोण की तुलना में एक क्लीनर और तेजी से समाधान है:

double frac = value % 1;

7
एक नोट: नकारात्मक मूल्यों के लिए, यह नकारात्मक है : -12.34% 1 => -0.33999999999999986
— एलेक्स पोका

16

गोलाई समस्या के बिना हल:

double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);

आउटपुट: 20

ध्यान दें कि यदि हम दशमलव में नहीं आए, तो यह आउटपुट करेगा 19।

इसके अलावा:

  • के लिए 318.40: आउटपुट 40(बजाय39)
  • के लिए 47.612345: आउटपुट 61(बजाय612345)
  • के लिए 3.01आउटपुट: 01(बजाय 1)

यदि आप वित्तीय संख्या के साथ काम कर रहे हैं, उदाहरण के लिए यदि इस मामले में आप प्राप्त करने की कोशिश कर रहे हैं एक लेनदेन राशि सेंट का हिस्सा , तो हमेशा decimalडेटा प्रकार का उपयोग करें ।

अपडेट करें:

निम्नलिखित भी काम करेगा यदि इसे एक स्ट्रिंग के रूप में संसाधित किया जाए (@ SearchForKnowledge के उत्तर पर निर्माण)।

10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]

तब आप Int32.Parseइसे इंट में बदलने के लिए उपयोग कर सकते हैं ।


1
आधुनिक लोगों के लिए अंगूठे
— Ivandro Jao

मैंने इसका इस्तेमाल किया ... 10.2d.ToString ("0.00", कल्चरइन्फो। InvariantCulture) .Split ('।') [1]
— ज़िग्लर

10

बेहतर तरीका -

        double value = 10.567;
        int result = (int)((value - (int)value) * 100);
        Console.WriteLine(result);

आउटपुट -

56

2
परीक्षण नहीं किया, लेकिन यह फ्लोट की अशुद्धि से ग्रस्त है, नहीं?
— मफू

इसके लिए 10.20आउटपुट देंगे 19। मेरा जवाब देखिए।
— orad

9

सबसे सरल संस्करण संभवतः Math.truncate () के साथ है

double value = 1.761
double decPart = value - Math.truncate(value)

2

मुझे लगता है कि यह धागा पुराना हो रहा है लेकिन मुझे विश्वास नहीं हो रहा है कि किसी ने भी Math.Floor का उल्लेख नहीं किया है

//will always be .02 cents
(10.02m - System.Math.Floor(10.02m))

सुपर आलसी के लिए:double fract(double x) { return x - System.Math.Floor(x); }
— फेलिप

1
var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2]

इसे एक स्ट्रिंग के रूप में लौटाता है (लेकिन आप हमेशा उस इंट को वापस कास्ट कर सकते हैं), और मानता है कि संख्या एक "" है। कहीं।


1
int last2digits = num - (int) ((double) (num /  100) * 100);

प्रश्न पहले 2 दशमलव अंक प्राप्त करना है। नंबर के लिए 318.401567dअपने समाधान आउटपुट 0.401567जहां 40अपेक्षित है।
— orad

0
    public static string FractionPart(this double instance)
    {
        var result = string.Empty;
        var ic = CultureInfo.InvariantCulture;
        var splits = instance.ToString(ic).Split(new[] { ic.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries);
        if (splits.Count() > 1)
        {
            result = splits[1];
        }
        return result;
    }

0

यहाँ एक विस्तार विधि मैंने एक समान स्थिति के लिए लिखी है। मेरा आवेदन 2.3 या 3.11 के प्रारूप में नंबर प्राप्त करेगा जहां संख्या के पूर्णांक घटक वर्षों का प्रतिनिधित्व करते हैं और भिन्नात्मक घटक महीनों का प्रतिनिधित्व करते हैं।

// Sample Usage
int years, months;
double test1 = 2.11;
test1.Split(out years, out months);
// years = 2 and months = 11

public static class DoubleExtensions
{
    public static void Split(this double number, out int years, out int months)
    {
        years = Convert.ToInt32(Math.Truncate(number));

        double tempMonths = Math.Round(number - years, 2);
        while ((tempMonths - Math.Floor(tempMonths)) > 0 && tempMonths != 0) tempMonths *= 10;
        months = Convert.ToInt32(tempMonths);
    }
}

0

यह ओवरहेड हो सकता है लेकिन काम करना चाहिए।

double yourDouble = 1.05;
string stringForm = yourDouble.ToString();
int dotPosition = stringForm.IndexOf(".");
decimal decimalPart = Decimal.Parse("0" + stringForm.Substring(dotPosition));

Console.WriteLine(decimalPart); // 0.05

0
 string input = "0.55";
    var regex1 = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+");
    if (regex1.IsMatch(input))
    {
        string dp= regex1.Match(input ).Value;
    }

1
यह बहुत बढ़िया होगा यदि आप इस पर एक विवरण जोड़ सकते हैं कि कैसे रेगेक्स समस्या को हल करने में मदद करता है
— क्लेप्टस

-1

आप .जिस दोहरे का उपयोग करने का प्रयास कर रहे हैं, उससे डॉट हटा सकते हैंRemove() डबल को स्ट्रिंग में परिवर्तित करने के बाद फ़ंक्शन ताकि आप उस पर आवश्यक संचालन कर सकें

_Doubleके मूल्य के दोहरे होने पर विचार करें 0.66781, निम्न कोड केवल डॉट के बाद की संख्या दिखाएगा .जो कि हैं66781

double _Double = 0.66781; //Declare a new double with a value of 0.66781
string _Decimals = _Double.ToString().Remove(0, _Double.ToString().IndexOf(".") + 1); //Remove everything starting with index 0 and ending at the index of ([the dot .] + 1) 

एक और समाधान

आप वर्ग का उपयोग कर सकते हैं Pathजो क्रॉस-प्लेटफ़ॉर्म तरीके से स्ट्रिंग इंस्टेंस पर संचालन करता है

double _Double = 0.66781; //Declare a new double with a value of 0.66781
string Output = Path.GetExtension(D.ToString()).Replace(".",""); //Get (the dot and the content after the last dot available and replace the dot with nothing) as a new string object Output
//Do something

-2

एक regex का उपयोग करें: Regex.Match("\.(?\d+)")कोई मुझे सही कर रहा है अगर मैं यहाँ गलत हूँ


बहुत लोकप्रिय नहीं है, Regex.Matchलेकिन मुझे दशमलव के मान को प्राप्त करने की कोशिश करते समय निम्न त्रुटि मिली हैArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.
— पिकरोफ़ो सॉफ्टवेयर

-2

यह बहुत ही सरल है

       float moveWater =  Mathf.PingPong(theTime * speed, 100) * .015f;
       int    m = (int)(moveWater);
       float decimalPart= moveWater -m ;

       Debug.Log(decimalPart);

-2

उपयोग क्यों नहीं int y = value.Split('.')[1];?

Split()समारोह अलग-अलग सामग्री में मूल्य विभाजन और 1बाद 2 मूल्य outputting है.


यह काम करेगा:Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))
— orad

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