দশমিক / ডাবল পূর্ণসংখ্যা হয় কীভাবে তা নির্ধারণ করবেন?


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সাধারণত দশমিক পয়েন্টের কিছু আছে কিনা তা পরীক্ষা করার উপায় way

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
আমিও মনে করি উপরের দিকে অ্যাড্রিয়ানের মন্তব্যটি সেরা উত্তর। তার পরামর্শকে আনুষ্ঠানিক সি # কোডে রাখতে: যদি (ম্যাথ.এবস (এন% 1) <ডাবল।এপসিলন) {// এন পূর্ণসংখ্যা হয় তবে কিছু করুন}
রুবেন রামিরেজ প্যাড্রন

7
আইএমএইচও, মডুলাস অপারেটর এবং ভাসমান পয়েন্ট নম্বরগুলি কোনওভাবেই কার্যকরভাবে মিশে যায় না। প্রস্তাবিত কোডটি কী-স্ট্রোকের সংখ্যা ব্যবহার করে অবিশ্বাস্যরূপে বিভ্রান্ত করছে এবং .NET ভাষার বাইরে কোথাও কাজ করবে না will আমি বাজি ধরব এটি সঠিক উপায়ে (যা কোনও বিভাগকে মোটেই ব্যবহার করে না) থেকেও অনেক ধীর। এটি করার সঠিক উপায়টি হ'ল ব্যবহার করা Math.Abs(d-(int)d) < double.Epsilon। যেমন আমাদের সবার কলেজের প্রথম প্রোগ্রামিং ক্লাসের প্রথম সপ্তাহে শিখতে হবে।
kroe2

9
আসলে, যেমন প্রশ্নটি বর্ণিত হয়েছে, এই উত্তরটি সঠিক এবং মন্তব্যগুলি ভুল। ডাবল গাণিতিক উদ্দেশ্যগুলির জন্য একটি পূর্ণসংখ্যা কিনা তা নয়, বরং এটি কীভাবে প্রদর্শন করবেন তা ওপি জানতে চায় না। দশমিক বিন্দু ব্যতীত কেবল নির্ভুল পূর্ণসংখ্যার মানগুলি প্রদর্শিত হবে। এছাড়াও, ভাসমান পয়েন্টের সাথে মোড কার্যকর না হওয়া এবং .NET এর বাইরে কাজ না করা সম্পর্কে মন্তব্যটি ভালভাবে অবহিত নয়। এবং (int)dএটি একটি দুর্যোগ যা সর্বাধিক দ্বিগুণ মানের জন্য ব্যতিক্রম ছুঁড়ে দেবে।
জিম বাল্টার

49

এটি করার বিভিন্ন উপায় রয়েছে। উদাহরণ স্বরূপ:

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

আপনি মডুলোও ব্যবহার করতে পারেন।

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

এর মধ্যে একটির কি অন্যটির চেয়ে দ্রুত হতে পারে? আমি এটি একটি পারফরম্যান্স সংবেদনশীল প্রসঙ্গে করতে চাই।
তুলসী

@ বাসিল - পরিস্থিতি নির্ভর করে। আপনার নিজের জন্য কিছু সময় করা উচিত এবং বিচার করা উচিত।
এরিক ফানকেনবাশ

4
Math.Abs(d-(int)d) < double.Epsilonনিরাপদ থেকেd == (int)d
31:34

3
@ ম্যাথিউফোস্কারিনি - আমি মনে করি আপনি বিভ্রান্ত এটি এটিকে মিথ্যা হিসাবে সেট করে, কারণ ১ 16.১ - an.১ এর ফলাফলটি কোনও আন্তঃ নয়। বিন্দুটি একটি প্রদত্ত মান একটি অন্তর্গত কিনা তা খুঁজে বের করতে হবে, আনুমানিক কোনও অন্তর্নিহিত কিছু যদি কোন অন্তর্নিহিত হয় তা নয়।
এরিক ফানকেনবাশ

1
@ ম্যাথিউফোস্কারিনি - হ্যাঁ, একটি আন্তঃ দশমিক মান (বা 0 এর দশমিক মান) ছাড়াই একটি সংখ্যা। 16.1-6.1 একটি 0 দশমিক মান তৈরি করে না, এটি একটি খুব ছোট অ-শূন্য মান যা আইইইই ফ্লোটিং পয়েন্ট ফর্ম্যাট ক্রিকের কারণে ঘটে। সংখ্যাটি দশমিক মান হিসাবে গ্রহণযোগ্য কিনা তা জানার কোনও উপায় নেই, সুতরাং একটি বৃত্তাকার মান ধরে নেওয়া ঠিক ততই অসম্পূর্ণ। প্রশ্নের উদ্দেশ্যটি ছিল কোনও ভাসমান পয়েন্ট সংখ্যাটি পূর্ণসংখ্যা কিনা তা নয়, এটি প্রায় কোনও পূর্ণসংখ্যা কিনা তা নয়।
এরিক ফানকেনবাশ 21

21

এ কেমন?

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

একই কোড decimal

মার্ক Byers একটি ভাল পয়েন্ট তৈরি, আসলে: এই তুমি কি নাও হতে পারে সত্যিই চাই। আপনি যদি সত্যিই যত্নবান হন তবে নিকটস্থ দুটি দশমিক স্থানে গোল সংখ্যাটি পূর্ণসংখ্যা কিনা তা আপনি পরিবর্তে এটি করতে পারেন:

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

1
সম্ভবত আপনার সমাধানটি আপডেট করুন এবং যুক্ত করুন: && নম্বর <int.MaxValue && সংখ্যা> int.MinValue
ওয়াল্টার 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

@ মার্ক আকর্ষণীয় মনে হচ্ছে আপনার কাছে এমন কোনও বিন্যাসের উদাহরণ রয়েছে যা শূন্যের পিছনে চলে?
জিম জের্ত্স 21

আমি সম্মত হই যে এটি নিরাপদ এবং ওপি সম্ভবত কী করবে, তবে এটি একটি সংক্ষিপ্ত অংশের অংশ রয়েছে কিনা তা সংকীর্ণ (তবে আরও আকর্ষণীয়) প্রশ্নের উত্তর নয়।
ক্লিফোর্ড

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);
গ্রেগসডেনিস

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;
}

প্রথম পরীক্ষা, তারপরে এটি নিক্ষেপ করুন এটি মিথ্যা প্রত্যাবর্তন ব্যতীত অন্য কোনও ব্যতিক্রম ছুঁড়ে ফেলবে, সম্ভবত আপনার উত্তরটি আপডেট করুন
ওয়াল্টার Vehoeven

@ কম্পিউটার, হ্যাঁ ভাল পয়েন্ট। Castালাই ফেলে দেওয়ার বিষয়ে, আমার ধারণা এটি আপনার প্রকল্পের সেটিংয়ের উপর নির্ভর করবে।
নওফাল


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
হ্যাঁ, তিনি দশমিক বিন্দু ছাড়াই ডাবল বা দশমিক মান ফর্ম্যাট করতে চান। আপনাকে ধন্যবাদ ...
বালকানগ্রাফ


0

আমি একটি অনুরূপ পরিস্থিতির মুখোমুখি হয়েছিলাম, তবে যেখানে মানটি একটি স্ট্রিং। ব্যবহারকারীর এমন একটি মান যা ডলারের পরিমাণ হিসাবে গণ্য হয় তাই টাইপ করে, তাই আমি যাচাই করতে চাই যে এটি সংখ্যাসূচক এবং সর্বোচ্চ দুটি দশমিক স্থান রয়েছে।

এখানে যদি সত্যায়িত হয় তবে আমার কোডটি যদি স্ট্রিং "s" সর্বাধিক দুটি দশমিক স্থানে এবং অন্যথায় মিথ্যা হিসাবে একটি সংখ্যাকে উপস্থাপন করে। এটি এমন কোনও সমস্যা এড়ায় যা ভাসমান-পয়েন্টের মানকে অসম্পূর্ণ করে তোলে from

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

ইনট্রি ট্রাই পার্স ব্যবহার করলে এই ফলাফলগুলি পাওয়া যাবে:

        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

আপনি 'ট্রাইপার্স' পদ্ধতিটি ব্যবহার করতে পারেন।

int.TryParse()

মানটি পূর্ণসংখ্যার পুরো সংখ্যাতে রূপান্তর করা যায় কিনা তা এই পরীক্ষা করে che ফলস্বরূপ এমন পতাকাটি নির্দেশ করতে পারে যা আপনার কোডের অন্য কোথাও ব্যবহার করা যেতে পারে।


Int.TryParse এর জন্য আর্গুমেন্ট একটি স্ট্রিং, ডাবল নয়।
জিম বাল্টার

yourDouble.toString("G17")
ব্যাকডোরনোবাবি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.