ডাবল NaN এর সমান কিনা তা আপনি কীভাবে পরীক্ষা করবেন?


283

আমার জাভাতে দ্বিগুণ আছে এবং আমি এটি কিনা তা যাচাই করতে চাই NaN। এই কাজ করতে সবচেয়ে ভালো উপায় কি?

উত্তর:


475

স্ট্যাটিক ব্যবহার করুন Double.isNaN(double)পদ্ধতি, অথবা আপনার Double'র .isNaN()পদ্ধতি।

// 1. static method
if (Double.isNaN(doubleValue)) {
    ...
}
// 2. object's method
if (doubleObject.isNaN()) {
    ...
}

সহজভাবে করছেন:

if (var == Double.NaN) {
    ...
}

হয় যথেষ্ট নয় কিভাবে কারণে NaN জন্য আইইইই মান এবং ফ্লোটিং পয়েন্ট সংখ্যার সংজ্ঞায়িত করা হয়।


51
এটি করার আর একটি উপায় হ'ল v! = V। কেবল নাএন নিজের সাথে মিথ্যা তুলনা করে। যদিও এটি করবেন না, isNaN একটি মিলিয়ন গুণ ভাল। :)
জোড়েন

5
@ জোরেন, আগের চেয়ে আরও দেরী: 'ইজ ন্যান' পাঠযোগ্যতার জন্য v! = V এর চেয়ে বেশি ব্যবহার করা ভাল। তবে isNaN পদ্ধতির উত্স কোডটি v! = V বলার মতোই হ'ল উত্স: স্থির পাবলিক বুলিয়ান isNaN (ডাবল ভি) {রিটার্ন (v! = V); }
রল্ফ

1
Double.isNaN should be (true) সুন্দর উত্তর
অলিভার শ

@Joren isNaN শুধু বনাম পরীক্ষা = V;) কিন্তু এটা ভাল দেখায়!
জনাব Jedi

জাভা 5 ব্যবহার করে: value == Double.NaNকাজ করে না, তবে Double.isNaN(value)ঠিক কাজ করে।
শূন্য01 আলফা

45

চেষ্টা করুন Double.isNaN():

যদি এই দ্বিগুণ মানটি নন-অ-সংখ্যা (NaN) হয় তবে সত্য হয় Return

নোট করুন [ double.isNaN()] কাজ করবে না, কারণ আনবক্সড ডাবলসের সাথে সম্পর্কিত পদ্ধতি নেই।


আমি ভেবেছিলাম আপনি জাভাতে আদিম ধরণের পদ্ধতিগুলি কল করতে পারবেন না। এটি সত্যই হওয়া দরকার Double.isNan()এবং তাই না double.IsNan()?
জোরেেন

জোরেেন, তিনি অটোবক্সিংয়ের উপর নির্ভর করছেন (সংকলক / রানটাইম দ্বারা ডাবল রূপান্তরিত হয়ে ডাবল); 1.5 পরে নতুন বৈশিষ্ট্য। এই দিকে যাওয়ার সামান্য ঝুঁকি; ডাবল থেকে ডাবল যেতে নালপয়েন্টারএক্সেপশনগুলির ঝুঁকি তৈরি করে।
এম 1 ই কে

আমি ভেবেছিলাম অটোবক্সিং কেবল এটি একটি সংগ্রহের সাথে যুক্ত করে এবং এটির মতো যুক্তি হিসাবে ডাবলটি ব্যবহার করে কাজ করে। ডাবল এক্স ঘোষণা করার চেষ্টা করুন এবং তারপরে এক্সকে ইসনন () জিজ্ঞাসা করুন - আমাকে একটি সংকলক ত্রুটি দেয়।
কার্ল

সত্যিই, আমার সন্দেহ হয় অ্যান্ড্রু প্রথম শিফট কীটি প্রথম "ডাবল" টাইপ করেই মিস করেছেন।
কার্ল

14

আপনি কোনও মান সীমাবদ্ধ কিনা তাও পরীক্ষা করে বিবেচনা করতে চাইতে পারেন Double.isFinite(value)। জাভা 8 থেকে Doubleক্লাসে একটি নতুন পদ্ধতি রয়েছে যেখানে আপনি মানটি এনএন এবং অসীম না হলে আপনি একবারে যাচাই করতে পারেন।

/**
 * Returns {@code true} if the argument is a finite floating-point
 * value; returns {@code false} otherwise (for NaN and infinity
 * arguments).
 *
 * @param d the {@code double} value to be tested
 * @return {@code true} if the argument is a finite
 * floating-point value, {@code false} otherwise.
 * @since 1.8
 */
public static boolean isFinite(double d)

10

আপনি ব্যবহার করে NaN জন্য চেক করতে পারেন var != varNaNসমান হয় না NaN

সম্পাদনা : এটি সম্ভবত সবচেয়ে খারাপ পদ্ধতি। এটি বিভ্রান্তিকর, পাঠযোগ্যতার জন্য ভয়ানক এবং সামগ্রিক খারাপ অনুশীলন।


3
কেউ কি ডাউনটোটকে ব্যাখ্যা করতে পারে? আমি জানি, এই isNanউপায়টি খুব খারাপ, এবং পাঠযোগ্যতার পক্ষে আরও ভাল, তবে এটি কাজ করে, তাই না? এবং isNanপদ্ধতিটি এটি পরীক্ষা করার জন্য ব্যবহার করে NaN
হাইপারনিউট্রিনো

1
আমি অনুমান করছি ডাউনওয়েটটি ছিল কারণ এই উপায়টি খুব খারাপ, এবং পাঠযোগ্যতার জন্য isNaN ভাল।
এডওয়ার্ড ফালক

1
আমি আপনাকে হ্রাস করি নি, তবে আমি মনে করি অতিরিক্ত মন্তব্যটি এখানে কার্যকর হবে: আপনি যদি ফ্লোট বা ডাবলের মতো মোড়কের সাথে তুলনা করেন তবে আপনি তাদের মানগুলির সাথে এইভাবে রেফারেন্সের তুলনা করেন না, যা অবশ্যই আপনি চান তা নয়।
যুদ্ধ_স্লাগ

3
@ ব্যাটেল_স্লাগ মন্তব্যের জন্য ধন্যবাদ। আমি জানি যে এটি খুব খারাপ ধারণা, তবে আমি এটি এখানে সম্পূর্ণতার জন্য রেখেছি।
হাইপারনিউটারিনো

isNaNএটি হুডের নীচে করে তবে এটি কীভাবে কাজ করে? কীভাবে কিছু নিজের সমান হয় না ??
উইলমল

0

নতুনদের ব্যবহারিক উদাহরণ প্রয়োজন। সুতরাং নিম্নলিখিত কোড চেষ্টা করুন।

public class Not_a_Number {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String message = "0.0/0.0 is NaN.\nsimilarly Math.sqrt(-1) is NaN.";        
    String dottedLine = "------------------------------------------------";     

    Double numerator = -2.0;
    Double denominator = -2.0;      
    while (denominator <= 1) {
        Double x = numerator/denominator;           
        Double y = new Double (x);
        boolean z = y.isNaN();
        System.out.println("y =  " + y);
        System.out.println("z =  " + z);
        if (z == true){
            System.out.println(message);                
        }
        else {
            System.out.println("Hi, everyone"); 
        }
        numerator = numerator + 1;
        denominator = denominator +1;
        System.out.println(dottedLine);         
    } // end of while

} // end of main

} // end of class

2
এই উদাহরণটি খুব বেশি করে এবং আপনি কী দেখানোর চেষ্টা করছেন তা পরিষ্কার নয়। এটি খণ্ডিত কোডের একটি গুচ্ছ মাত্র।
জারেড হুপার

3
এই প্রশ্নটি '09-এ যখন পুনরায় জিজ্ঞাসা করা হয়েছিল তখন ওপি হিসাবে একজন শিক্ষানবিস হিসাবে, আমি আপনাকে নিশ্চয়তা দিতে পারি যে গৃহীত উত্তরটি এই "ব্যবহারিক" উদাহরণের চেয়ে অনেক বেশি সহায়ক ছিল।
এরিক উইলসন

এই উদাহরণ কোডটি পোস্ট করার জন্য আপনাকে @ পিজিগজেন্দ্র বাবুকে ধন্যবাদ জানাই।
ডাটেন্ট 26'17

0

নীচের কোড স্নিপেট আদিম ধরণের হোল্ড এনএএন মূল্যায়ন করতে সহায়তা করবে।

double dbl = Double.NaN; Double.valueOf(dbl).isNaN() ? true : false;

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