ডাবলটি পূর্ণসংখ্যা হলে কীভাবে পরীক্ষা করবেন


165

এটা করা কি সম্ভব?

double variable;
variable = 5;
/* the below should return true, since 5 is an int. 
if variable were to equal 5.7, then it would return false. */
if(variable == int) {
    //do stuff
}

আমি জানি কোড সম্ভবত যে মত কিছু যেতে না, কিন্তু কিভাবে করে এটি যেতে?


1
সি শার্প কিন্তু জাভা অনুরূপ: stackoverflow.com/a/4077262/284240 ( Integer.MAX_VALUE )
টিম Schmelter

1
এ থেকে আপনি কী লাভ করবেন? doubleএবং intমেমোরিতে আলাদাভাবে উপস্থাপিত হয় এবং আপনি আপনার মেমোরি হ্যান্ডলিংয়ের প্রেক্ষাপটের ভিত্তিতে একটি বা অন্যটি ব্যবহার করবেন।
মাকোটো

@ কিংবদন্তি, আপনার পরামর্শ অনুসারে আমিও তাই করতাম; আপনি কি সুযোগেই জানেন যে% 1 জন দক্ষতার সাথে তুলনামূলকভাবে ম্যাথ.ফ্লুয়ার (ভেরিয়েবল) অন্যান্য ব্যবহারকারীদের পরামর্শের সাথে কীভাবে তুলনা করেন?
জি। বাচ

3
@ মাকোটো এটি পাইগাটোরিয়ান ট্রিপল সন্ধান করার জন্য একটি প্রোগ্রাম। স্কোয়ারের শিকড়গুলি কখনও কখনও দ্বিগুণ হতে পারে তবে একই সময়ে এগুলি কখনও কখনও সংখ্যায় অন্তর্ভুক্তও হতে পারে। তুমি কি বুঝাতে চাও?
জেএক্সফোনিক্স

@ জেএক্সফোনিক্স: সুতরাং মানগুলি একটি ভাসমান-পয়েন্ট মান বা একটি পূর্ণসংখ্যা মান হতে পারে। বোধ হয়।
মাকোটো

উত্তর:


146
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}

ডাবলের রাউন্ড-ডাউন মানটি ডাবলের সমান কিনা এটি পরীক্ষা করে।

আপনার ভেরিয়েবলের কোনও int বা ডাবল মান থাকতে পারে এবং Math.floor(variable)সর্বদা একটি int মান থাকতে পারে, সুতরাং যদি আপনার ভেরিয়েবলের সমান হয় Math.floor(variable)তবে এর অবশ্যই কোনও মান অবশ্যই হবে।

যদি ভেরিয়েবলের মান অসীম বা নেতিবাচক অসীম হয় তবে এটি কাজ করে না যতক্ষণ শর্তটির সাথে 'ভেরিয়েবল অনির্দিষ্ট নয়' যুক্ত করা হয়।


3
"যদি আর্গুমেন্ট NaN বা একটি অনন্ত বা ধনাত্মক শূন্য বা negativeণাত্মক শূন্য হয়, তবে ফলাফলটি আর্গুমেন্টের সমান।" docs.oracle.com/javase/6/docs/api/java/lang/…
টিম শেমলেটার

2
@ টিমশ্মেলটার: ভাল ক্যাচ এটিও লক্ষণীয় যে এনএএন সমান কিছু নয় (নিজেই অন্তর্ভুক্ত) তবে +/- ইনফ নিজেই সমান - সুতরাং দুটি প্রান্তের কেস রয়েছে!
maerics

স্কন এবং ফুয়াদ উভয়ই আরও ভাল উত্তর পোস্ট করেছিলেন।
জোয়েল ক্রিস্টোফেল

@ জোয়েলক্রিস্টোফেল: আমি একমত নই। এটি একটি ভাল উপায় কারণ এটি টাইপ ওভারফ্লোয়ের ঝুঁকি দূর করে। আমি পছন্দ করি না শুধুমাত্র জিনিসটি ভেরিয়েবল একটি ছিল মূল্যায়ন intযদি । iftrue
বাথশেবা

@ বাথশেবা (Double.POSITIVE_INFINITY% 1) == 0 এবং এর নেতিবাচক অংশ উভয়ই মিথ্যা হিসাবে মূল্যায়ন করে।
জোয়েল ক্রিস্টোফেল 16

222

অথবা আপনি মডুলো অপারেটরটি ব্যবহার করতে পারেন:

(d % 1) == 0


2
আমি সত্যিই এই সমাধানটির সরলতা পছন্দ করি। এটি পড়া এবং বাস্তবায়ন উভয়ই সহজ।
ক্রিস্পি

1
খুব স্বজ্ঞাত সমাধান
ড্যানিয়েল সান

3
গণনার ক্ষেত্রে এটির চেয়ে দ্রুতগতি Math.rint(d)কি?
আইটুরকি

2
হ্যাঁ এটি দুর্দান্ত, তবে নোট করুন এটি একটি জাভা সমাধান এবং dসি এবং সি ++ এর নেতিবাচক জন্য ভালভাবে সংজ্ঞায়িত নয় ।
বাথশেবা

4
সোনারে এটি "ইক্যুয়ালিটি টেস্টিং ফ্লোটিং পয়েন্ট ভ্যালু দিয়ে তৈরি করা উচিত নয়" একটি সমস্যা তৈরি করে।
জুলিও ডি

86

পেয়ারা: DoubleMath.isMathematicalInteger। (প্রকাশ: আমি এটি লিখেছি।) অথবা আপনি যদি ইতিমধ্যে পেয়ারা আমদানি x == Math.rint(x)না করে থাকেন তবে এটি করার দ্রুততম উপায়; rintmeasurably দ্রুত চেয়ে floorবা ceil


3
ম্যাথ.প্রিন্ট সম্পর্কে জানতেন না আপনি সঠিক। এটি ম্যাথ.ফ্লুরের চেয়ে অনেক দ্রুত
লেনি মার্কাস

এটি কি কোনওভাবে ইঞ্জিফুয়েডের কাস্টিং উদাহরণের চেয়ে পছন্দনীয়?
জোয়েল ক্রিস্টোফেল 16

@ জোয়েলক্রিস্টোফেল: হ্যাঁ পূর্ণসংখ্যার মানগুলির সাথে সমস্ত দ্বিগুণ ইনট বা আরও দীর্ঘতর নয়, যাতে এই পরীক্ষাটি তাদের উপর কার্যকর হয় না।
লুই ওয়াসারম্যান

Gotcha। তারপরে (d% 1) == 0 এখনও বৈধ।
জোয়েল ক্রিস্টোফেল


6

এইভাবে চেষ্টা করুন,

public static boolean isInteger(double number){
    return Math.ceil(number) == Math.floor(number); 
}

উদাহরণ স্বরূপ:

Math.ceil(12.9) = 13; Math.floor(12.9) = 12;

অত: পর 12.9 হয় না , পূর্ণসংখ্যা তবুও

 Math.ceil(12.0) = 12; Math.floor(12.0) =12; 

সুতরাং 12.0 পূর্ণসংখ্যা হয়


3

এখানে একটি সংস্করণ Integerএবং Double:

    private static boolean isInteger(Double variable) {
    if (    variable.equals(Math.floor(variable)) && 
            !Double.isInfinite(variable)          &&
            !Double.isNaN(variable)               &&
            variable <= Integer.MAX_VALUE         &&
            variable >= Integer.MIN_VALUE) {
        return true;
    } else {
        return false;
    }
}

রূপান্তর Doubleকরতে Integer:

Integer intVariable = variable.intValue();

3

বিবেচনা:

Double.isFinite (value) && Double.compare (value, StrictMath.rint (value)) == 0

এটি মূল জাভাতে আটকে রয়েছে এবং ভাসমান পয়েন্টের মানগুলির মধ্যে সমতা তুলনা ==এড়ায় যা খারাপ বলে বিবেচিত হয়। isFinite()যেমন প্রয়োজনীয় rint()করবে পাস-থ্রু অনন্ত মান।



3

এখানে একটি ভাল সমাধান:

if (variable == (int)variable) {
    //logic
}

the (bool)ালাই কেন ?
xdavidliu

1
@xdavidliu এর জন্য কোনও প্রয়োজন নেই। আমরা এটিকে উপেক্ষা করতে পারি।
নীতীশ

2

উপরের স্কনজিটের উত্তরের মতো, তবে অভিনয়টি আরও ভাল (কমপক্ষে জাভাতে):

Double zero = 0d;    
zero.longValue() == zero.doubleValue()

1
public static boolean isInteger(double d) {
  // Note that Double.NaN is not equal to anything, even itself.
  return (d == Math.floor(d)) && !Double.isInfinite(d);
}

আরও সঠিক বাস্তবায়ন মিথ্যা প্রত্যাবর্তন করবে এবং আপনাকে অন্য একটি পদ্ধতি লিখতে হবে যা যুক্তি হিসাবে গ্রহণ করবে এবং সত্য হিসাবে ফিরে আসবে। : ডি
আলফা

0

আপনি এইভাবে চেষ্টা করতে পারেন: দ্বিগুণের পূর্ণসংখ্যার মানটি পান, মূল ডাবল মান থেকে এটি বিয়োগ করুন, একটি বৃত্তাকার সীমা নির্ধারণ করুন এবং নতুন ডাবল মানের পূর্ণ সংখ্যা (পূর্ণসংখ্যা অংশ ব্যতীত) আপনার চেয়ে বড় বা ছোট হলে পরীক্ষা করুন সংজ্ঞায়িত পরিসীমা। যদি এটি ছোট হয় তবে আপনি এটির ইন্টিজার মান করতে পারেন। উদাহরণ:

public final double testRange = 0.2;

public static boolean doubleIsInteger(double d){
    int i = (int)d;
    double abs = Math.abs(d-i);
    return abs <= testRange;
}

যদি আপনি ডি নির্ধারিত হন 33.15 পদ্ধতিটি সত্য হয়। আরও ভাল ফলাফল পেতে আপনি নিজের বিবেচনার ভিত্তিতে টেস্টরেঞ্জকে (0.0002 হিসাবে) কম মান নির্ধারণ করতে পারেন।


0

ব্যক্তিগতভাবে, আমি গ্রহণযোগ্য উত্তরে সাধারণ মডুলো অপারেশন সমাধানটিকে পছন্দ করি। দুর্ভাগ্যক্রমে, সোনারকিউব কোনও বৃত্ত নির্ভুলতা নির্ধারণ না করে ভাসমান পয়েন্ট সহ সমতা পরীক্ষা পছন্দ করে না। সুতরাং আমরা আরও মেনে চলার সমাধান খুঁজতে চেষ্টা করেছি। এটা এখানে:

if (new BigDecimal(decimalValue).remainder(new BigDecimal(1)).equals(BigDecimal.ZERO)) {
    // no decimal places
} else {
    // decimal places
}

Remainder(BigDecimal)একটি ফেরৎ BigDecimalযার মান (this % divisor)। এটি যদি শূন্যের সমান হয় তবে আমরা জানি কোনও ভাসমান বিন্দু নেই।



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