यह कैसे निर्धारित किया जाए कि दशमलव / डबल एक पूर्णांक है?


225

मैं कैसे बताऊँ कि दशमलव या दोहरा मान पूर्णांक है?

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

decimal d = 5.0; // Would be true
decimal f = 5.5; // Would be false

या

double d = 5.0; // Would be true
double f = 5.5; // Would be false

कारण मैं यह जानना चाहूंगा ताकि मैं प्रोग्रामेटिक रूप से यह निर्धारित कर सकूं कि मैं मूल्य का उपयोग करके उत्पादन करना चाहता हूं .ToString("N0")या .ToString("N2")। यदि कोई दशमलव बिंदु मान नहीं है, तो मैं वह नहीं दिखाना चाहता।

जवाबों:


410

फ़्लोटिंग पॉइंट नंबरों के लिए, n % 1 == 0आमतौर पर यह जांचने का तरीका होता है कि दशमलव बिंदु में कुछ भी है या नहीं।

public static void Main (string[] args)
{
    decimal d = 3.1M;
    Console.WriteLine((d % 1) == 0);
    d = 3.0M;
    Console.WriteLine((d % 1) == 0);
}

आउटपुट:

False
True

अपडेट: जैसा कि @ एड्रियन लोपेज ने नीचे उल्लेख किया है, एक छोटे मूल्य के साथ तुलनाepsilonफ्लोटिंग-पॉइंट कम्प्यूटेशन मिस-कैलकुलेशन को छोड़ देगी। चूंकि सवालdoubleमूल्यों केबारे मेंहै, इसलिए नीचे एक और फ़्लोटिंग पॉइंट गणना प्रमाण उत्तर होगा:

Math.Abs(d % 1) <= (Double.Epsilon * 100)

96
यह तब काम करता है जब संख्या पूरी संख्या के रूप में शुरू होती है, लेकिन जरूरी नहीं कि जब संख्या कुछ फ्लोटिंग-पॉइंट कम्प्यूटेशन का परिणाम हो। कैसे के बारे में "(डी% 1) <एप्सिलॉन" जहां एप्सियन कुछ छोटे मूल्य है?
एड्रियन लोपेज

9
यह शर्म की बात है कि स्वीकार किए गए जवाब के बजाय इस धागे में सबसे अच्छा जवाब एक टिप्पणी है। अच्छा लगा एक एड्रियन।
स्टारकिथिच

13
मुझे भी लगता है कि ऊपर एड्रियन की टिप्पणी सबसे अच्छा जवाब है। औपचारिक C # कोड में अपनी सलाह देने के लिए: if (Math.Abs ​​(n% 1) <Double.Epsilon) {// कुछ करें यदि n पूर्णांक है}।
रबाइरेन्स पैडरॉन

7
IMHO, मापांक ऑपरेटर और फ्लोटिंग पॉइंट नंबर किसी भी तरह से उपयोगी नहीं हैं। सुझाए गए कोड अविश्वसनीय रूप से भ्रामक है जिसका उपयोग कीस्ट्रोक्स की संख्या को देखते हुए किया जाता है और यह .NET भाषाओं के बाहर लगभग कहीं भी काम करेगा। मुझे यकीन है कि यह सही तरीके से बहुत धीमी है (जो किसी भी विभाजन का उपयोग नहीं करता है)। ऐसा करने का सही तरीका उपयोग करना है Math.Abs(d-(int)d) < double.Epsilon। जैसे हमें कॉलेज में अपनी पहली प्रोग्रामिंग क्लास के पहले हफ्ते में सब सीख लेना चाहिए था।
krowe2

9
दरअसल, जैसा कि प्रश्न में कहा गया है, यह उत्तर सही है और टिप्पणियां गलत हैं। ओपी यह जानना नहीं चाहता है कि गणितीय उद्देश्यों के लिए एक डबल एक पूर्णांक है, बल्कि इसे कैसे प्रदर्शित किया जाए। दशमलव बिंदु के बिना केवल सटीक पूर्णांक मान प्रदर्शित किए जाने चाहिए। इसके अलावा, मॉड के बारे में टिप्पणी फ़्लोटिंग पॉइंट के साथ उपयोगी नहीं है और .NET के बाहर काम नहीं करने के बारे में अच्छी तरह से सूचित नहीं किया गया है। और (int)dएक आपदा है जो अधिकांश दोहरे मूल्यों के लिए एक अपवाद को फेंक देगी।
जिम बाल्टर

49

ऐसा करने के लिए कोई भी तरीके हैं। उदाहरण के लिए:

double d = 5.0;
bool isInt = d == (int)d;

तुम भी modulo का उपयोग कर सकते हैं।

double d = 5.0;
bool isInt = d % 1 == 0;

क्या इनमें से एक दूसरे से तेज होगा? मैं एक प्रदर्शन संवेदनशील संदर्भ में ऐसा करना चाहता हूं।
तुलसी

@ बासिल - परिस्थितियों पर निर्भर करता है। आपको अपने और जज के लिए कुछ समय देना चाहिए।
एरिक फनकेनबसच

4
Math.Abs(d-(int)d) < double.Epsilonसे ज्यादा सुरक्षित हैd == (int)d
रिएक्टगुलर

3
@MathewFoscarini - मुझे लगता है कि आप भ्रमित हैं। यह इसे गलत पर सेट करता है, क्योंकि 16.1 - 6.1 का परिणाम एक इंट नहीं है। बिंदु यह खोजना था कि क्या दिया गया मान एक int है, न कि यदि कोई वस्तु लगभग एक int है तो एक int है।
एरिक फुन्केनबस

1
@MathewFoscarini - हाँ, एक int एक दशमलव मान के बिना एक संख्या है (या 0 का एक दशमलव मान)। 16.1-6.1 एक 0 दशमलव मान नहीं बनाता है, यह IEEE फ़्लोटिंग पॉइंट प्रारूप quirks के कारण बहुत छोटा गैर-शून्य मान है। यह पता करने का कोई तरीका नहीं है कि संख्या का दशमलव मान रखने के लिए समर्थन किया गया है या नहीं, इसलिए मान लेना एक गोल मान गलत है। प्रश्न का उद्देश्य यह जानना था कि क्या एक फ्लोटिंग पॉइंट नंबर एक पूर्णांक था, न कि क्या यह लगभग पूर्णांक था।
एरिक फनकेनबस

21

इस बारे में कैसा है?

public static bool IsInteger(double number) {
    return number == Math.Truncate(number);
}

के लिए एक ही कोड decimal

मार्क बायर्स ने एक अच्छा मुद्दा बनाया, वास्तव में: यह वह नहीं हो सकता है जो आप वास्तव में चाहते हैं। अगर आप वास्तव में इस बात की परवाह करते हैं कि क्या निकटतम दो दशमलव स्थानों पर एक संख्या पूर्णांक है , तो आप इसके बजाय ऐसा कर सकते हैं:

public static bool IsNearlyInteger(double number) {
    return Math.Round(number, 2) == Math.Round(number);
}

1
शायद अपना समाधान अपडेट करें और जोड़ें: && संख्या <int.MaxValue && संख्या> int.MinValue
Walter Vehoeven

12

जबकि प्रस्तावित समाधान सरल उदाहरणों के लिए काम करते हैं, सामान्य रूप से ऐसा करना एक बुरा विचार है। एक संख्या बिल्कुल पूर्णांक नहीं हो सकती है, लेकिन जब आप इसे प्रारूपित करने का प्रयास करते हैं, तो यह पूर्णांक के करीब होता है जो आपको मिलता है 1.000000। ऐसा तब हो सकता है जब आप एक गणना करते हैं कि सिद्धांत में ठीक 1 देना चाहिए, लेकिन व्यवहार में एक संख्या को बहुत करीब देता है, लेकिन गोल त्रुटियों के कारण बिल्कुल एक के बराबर नहीं है।

इसके बजाय, इसे पहले प्रारूपित करें और यदि आपकी स्ट्रिंग शून्य के बाद की अवधि में समाप्त होती है तो उन्हें पट्टी करें। कुछ प्रारूप भी हैं जिनका उपयोग करके आप उस स्ट्रिप ट्रेलिंग शून्य का स्वतः ही उपयोग कर सकते हैं। यह आपके उद्देश्य के लिए काफी अच्छा हो सकता है।

double d = 1.0002;
Console.WriteLine(d.ToString("0.##"));
d = 1.02;
Console.WriteLine(d.ToString("0.##"));

आउटपुट:

1
1.02

@ मर्क दिलचस्प लगता है। क्या आपके पास प्रारूप का एक उदाहरण है जो शून्य से पीछे चल रहा है?
जिम जार्ज

मैं सहमत हूं कि यह सुरक्षित है और ओपी को शायद क्या करना चाहिए, लेकिन यह संकरा (लेकिन अधिक दिलचस्प) सवाल का जवाब नहीं है कि क्या एक मूल्य का एक आंशिक हिस्सा है या नहीं।
क्लिफोर्ड

3
@ क्लिफोर्ड: मैं आमतौर पर ओपी की समस्या को हल करने के लिए सबसे अच्छा जवाब देने की कोशिश करता हूं, न कि शीर्षक के आधार पर। शीर्षक शायद ही कभी समस्या का सटीक वर्णन करते हैं।
मार्क बायर्स

+1 सहमति दें कि फ़्लोटिंग और सटीक त्रुटियों के कारण यह देखने के लिए कि वे खराब हो सकते हैं या नहीं, यह देखने के लिए फ़्लोट्स या डबल्स का परीक्षण करने की कोशिश कर रहे हैं।
रोमेन हिप्पो

1
धन के उपयोग के लिए, आप शायद 1.2 को 1.20 के रूप में प्रदर्शित करना चाहेंगे, जो सुझाए गए समाधान के साथ ऐसा नहीं है। कोई लेने वाला?
केजेल रिलबे

10
bool IsInteger(double num) {
    if (ceil(num) == num && floor(num) == num)
        return true;
    else
        return false;
}

समस्या-समाधान।

संपादित करें: मार्क रुशकॉफ़ द्वारा लिया गया।


4
या बसreturn ceil(num) == num && floor(num) == num;
ब्रायन रासमुसेन

13
या सिर्फreturn ceil(num) == floor(num);
gregsdennis

4

मार्क रुशखॉफ़ का उत्तर सरल हो सकता है, लेकिन निम्नलिखित भी काम करते हैं और अधिक कुशल हो सकते हैं क्योंकि कोई अंतर्निहित विभाजन ऑपरेशन नहीं है:

     bool isInteger = (double)((int)f) == f ;

तथा

     bool isInteger = (decimal)((int)d) == d ;

यदि आप दोनों प्रकारों के लिए एक ही अभिव्यक्ति चाहते हैं, तो शायद

     bool isInteger = (double)((int)val) == (double)val ;

4

यदि ऊपरी और निचले Int32मामलों की सीमा :

public bool IsInt32(double value)
{
    return  value >= int.MinValue && value <= int.MaxValue && value == (int)value;
}

पहला परीक्षण, फिर इस तरह से डालना कि वह झूठे रिटर्न के अलावा कोई अपवाद छोड़ दे, शायद अपना जवाब अपडेट करें
वाल्टर वेव्सोवेन

@ कंप्यूटर, हाँ अच्छी बात है। कास्ट पर फेंकने के बारे में, मुझे लगता है कि यह आपके प्रोजेक्ट सेटिंग पर निर्भर करेगा।
नवाफल


2

आप डबल प्रकार के लिए स्ट्रिंग स्वरूपण का उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

double val = 58.6547;
String.Format("{0:0.##}", val);      
//Output: "58.65"

double val = 58.6;
String.Format("{0:0.##}", val);      
//Output: "58.6"

double val = 58.0;
String.Format("{0:0.##}", val);      
//Output: "58"

मुझे पता है अगर यह मदद नहीं करता है।


1
यह वास्तव में यह निर्धारित करने के सवाल को संबोधित नहीं करता है कि क्या मूल्य का कोई अंश नहीं है, जो कि गणितीय सवाल है। हालांकि यह संभवतः ओपी को अपने व्याख्यात्मक नोट के लिए क्या चाहिए।
क्लिफोर्ड

2
हां, वह केवल दशमलव बिंदु के बिना डबल या दशमलव मान प्रारूपित करना चाहता है। धन्यवाद ...
BALKANGraph


0

मैंने एक समान स्थिति का सामना किया, लेकिन जहां मूल्य एक स्ट्रिंग है। उपयोगकर्ता प्रकार एक मूल्य में है जो एक डॉलर की राशि माना जाता है, इसलिए मैं यह सत्यापित करना चाहता हूं कि यह संख्यात्मक है और अधिकांश दो दशमलव स्थानों पर है।

यहाँ मेरा कोड सही लौटने के लिए है यदि स्ट्रिंग "s" अधिकांश दो दशमलव स्थानों पर एक संख्यात्मक का प्रतिनिधित्व करता है, और अन्यथा गलत है। यह किसी भी समस्या से बचा जाता है जो फ्लोटिंग-पॉइंट मानों की गड़बड़ी के परिणामस्वरूप होगा।

try
{
    // must be numeric value
    double d = double.Parse(s);
    // max of two decimal places
    if (s.IndexOf(".") >= 0)
    {
        if (s.Length > s.IndexOf(".") + 3)
            return false;
    }
    return true;
catch
{
    return false;
}

मैं http://progblog10.blogspot.com/2011/04/determining-whether-numeric-value-has.html पर अधिक विस्तार से इस पर चर्चा करता हूं ।


4
यह मानता है कि आप एक संस्कृति के साथ काम कर रहे हैं। उदाहरण के लिए, यह उन संस्कृतियों के साथ ठीक से काम नहीं करेगा जो 1.000,00 जैसे दशमलव का प्रतिनिधित्व करते हैं
जिम

0

Int.TryParse के उपयोग से ये परिणाम प्राप्त होंगे:

        var shouldBeInt = 3;

        var shouldntBeInt = 3.1415;

        var iDontWantThisToBeInt = 3.000f;

        Console.WriteLine(int.TryParse(shouldBeInt.ToString(), out int parser)); // true

        Console.WriteLine(int.TryParse(shouldntBeInt.ToString(), out parser)); // false

        Console.WriteLine(int.TryParse(iDontWantThisToBeInt.ToString(), out parser)); // true, even if I don't want this to be int

        Console.WriteLine(int.TryParse("3.1415", out  parser)); // false

        Console.WriteLine(int.TryParse("3.0000", out parser)); // false

        Console.WriteLine(int.TryParse("3", out parser)); // true

        Console.ReadKey();

-2

शायद सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन यह काम करता है यदि आप बहुत प्यारे नहीं हैं!

bool IsInteger(double num) {
    return !num.ToString("0.################").Contains(".");
}

8
यह एक भयानक समाधान है
ओस्फो

-2

आप 'TryParse' पद्धति का उपयोग कर सकते हैं।

int.TryParse()

यह देखने के लिए जाँचता है कि मान पूर्णांक संख्या मान में परिवर्तित किया जा सकता है या नहीं। परिणाम फिर एक ध्वज को इंगित कर सकता है जिसका उपयोग आपके कोड में कहीं और किया जा सकता है।


Int.TryParse के लिए तर्क एक स्ट्रिंग है, एक डबल नहीं है।
जिम बाल्टर

yourDouble.toString("G17")
BackDoorNoBaby

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