Bagaimana Anda menguji untuk melihat apakah ganda sama dengan NaN?


283

Saya memiliki dobel di Jawa dan saya ingin memeriksa apakah ada NaN. Apa cara terbaik untuk melakukan ini?

Jawaban:


475

Gunakan statis Double.isNaN(double)metode, atau Anda Double's .isNaN()metode.

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

Cukup melakukan:

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

adalah tidak cukup karena bagaimana standar IEEE untuk NaN dan nomor floating point didefinisikan.


51
Cara lain untuk melakukan ini adalah v! = V. Hanya NaN yang membandingkan false dengan dirinya sendiri. Tapi jangan lakukan itu, isNaN sejuta kali lebih baik. :)
Joren

5
@Joren, lebih baik terlambat daripada tidak pernah: 'isNaN' memang lebih baik untuk digunakan daripada v! = V untuk keterbacaan. Tetapi kode sumber metode isNaN persis sama dengan mengatakan v! = V. Sumber: static public boolean isNaN (double v) {return (v! = V); }
Rolf ツ

1
Double.isNaN should be (true) jawaban yang bagus
Oliver Shaw

@Joren isNaN hanya memeriksa v! = V;) tetapi terlihat lebih baik
Mr Jedi

Menggunakan Java 5: value == Double.NaNtidak berfungsi, tetapi Double.isNaN(value)berfungsi dengan baik.
zero01alpha

45

Coba Double.isNaN():

Mengembalikan nilai true jika nilai ganda ini adalah Not-a-Number (NaN), false jika tidak.

Perhatikan bahwa [ double.isNaN()] tidak akan berfungsi, karena dobel tanpa kotak tidak memiliki metode yang terkait dengannya.


Saya pikir Anda tidak dapat memanggil metode pada tipe primitif di Jawa. Itu benar-benar perlu Double.isNan()dan tidak double.IsNan(), bukan?
Joren

Joren, dia mengandalkan autoboxing (double dikonversikan menjadi Double oleh kompiler / runtime); fitur baru mulai 1,5 dan seterusnya. Sedikit risiko menuju ke arah ini; dari Double ke Double menciptakan risiko NullPointerExceptions.
M1EK

Saya pikir autoboxing hanya berfungsi menggunakan double sebagai argumen, menambahkannya ke koleksi, dan sejenisnya. Coba mendeklarasikan double x dan kemudian meminta x ke isNaN () - memberi saya kesalahan kompiler.
Carl

Sungguh, saya curiga Andrew hanya melewatkan tombol shift mengetik "ganda" pertama.
Carl

14

Anda mungkin ingin mempertimbangkan juga memeriksa apakah suatu nilai terbatas Double.isFinite(value). Karena Java 8 ada metode baru di Doublekelas di mana Anda dapat memeriksa sekaligus jika nilai bukan NaN dan tak terbatas.

/**
 * 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

Anda dapat memeriksa NaN dengan menggunakan var != var. NaNtidak sama NaN.

EDIT : Ini mungkin metode yang paling buruk. Ini membingungkan, mengerikan untuk dibaca, dan praktik buruk secara keseluruhan.


3
Bisakah seseorang menjelaskan downvote? Saya tahu, cara ini sangat buruk, dan isNanlebih baik untuk dibaca, tetapi berfungsi, bukan? Dan isNanmetode ini menggunakan ini untuk memeriksa NaN.
HyperNeutrino

1
Saya menduga downvote itu karena cara ini sangat buruk, dan isNaN lebih baik untuk dibaca.
Edward Falk

1
Saya tidak menurunkan suara Anda, tetapi saya pikir komentar tambahan akan berguna di sini: jika Anda membandingkan pembungkus seperti Float atau Double Anda akhirnya membandingkan referensi dengan cara ini, bukan nilai-nilainya, yang jelas bukan yang Anda inginkan.
Battle_Slug

3
@Battle_Slug Terima kasih atas komentarnya. Saya tahu bahwa ini adalah ide yang sangat buruk, tetapi saya menaruhnya di sini untuk kelengkapan.
HyperNeutrino

isNaNapakah ini di bawah tenda, tetapi bagaimana cara kerjanya? Bagaimana sesuatu yang tidak sama dengan dirinya sendiri ??
wilmol

0

Pemula membutuhkan contoh-contoh praktis. jadi coba kode berikut.

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
Contoh ini terlalu banyak, dan tidak jelas apa yang Anda coba perlihatkan. Ini hanya sekelompok kode terfragmentasi.
Jared Hooper

3
Sebagai OP, yang adalah pemula ketika pertanyaan ini ditanyakan kembali pada '09, saya dapat meyakinkan Anda bahwa jawaban yang diterima jauh lebih bermanfaat daripada contoh "praktis" ini.
Eric Wilson

Terima kasih @pggajendra babu karena memposting kode contoh ini.
datnt

0

Cuplikan kode di bawah ini akan membantu mengevaluasi tipe primitif yang menahan NaN.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.