Làm thế nào để bạn kiểm tra xem một đôi có bằng NaN không?


283

Tôi có một gấp đôi trong Java và tôi muốn kiểm tra nếu nó là NaN. Cách tốt nhất để làm việc này là gì?

Câu trả lời:


475

Sử dụng các tĩnh Double.isNaN(double)phương pháp, hoặc của bạn Double's .isNaN()phương pháp.

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

Đơn giản chỉ cần làm:

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

không đủ do cách xác định tiêu chuẩn IEEE cho NaN và số dấu phẩy động .


51
Một cách khác để làm điều này sẽ là v! = V. Chỉ NaN so sánh sai với chính nó. Đừng làm vậy, isNaN tốt hơn gấp triệu lần. :)
Joren

5
@Joren, muộn còn hơn không bao giờ: 'isNaN' thực sự tốt hơn để sử dụng hơn v! = V để dễ đọc. Nhưng mã nguồn của phương thức isNaN hoàn toàn giống như nói v! = V. Nguồn: static boolean isNaN (double v) {return (v! = V); }
Rolf

1
Double.isNaN should be (true) câu trả lời hay
Oliver Shaw

@Joren isNaN chỉ cần kiểm tra v! = V;) nhưng có vẻ tốt hơn
Mr Jedi

Sử dụng Java 5: value == Double.NaNkhông hoạt động, nhưng Double.isNaN(value)chỉ hoạt động tốt.
zero01alpha

45

Hãy thử Double.isNaN():

Trả về true nếu giá trị Double này là Not-a-Number (NaN), ngược lại là sai.

Lưu ý rằng [ double.isNaN()] sẽ không hoạt động, vì các nhân đôi không được đóng hộp không có các phương thức liên quan đến chúng.


Tôi nghĩ bạn không thể gọi các phương thức trên các kiểu nguyên thủy trong Java. Nó thực sự cần phải Double.isNan()và không double.IsNan(), phải không?
Joren

Joren, anh ấy dựa vào autoboxing (nhân đôi được chuyển đổi thành Double bởi trình biên dịch / thời gian chạy); tính năng mới từ 1.5 trở đi. Ít rủi ro đi theo hướng này; đi từ Double đến Double sẽ tạo ra rủi ro về NullPulumExceptions.
M1EK

Tôi nghĩ autoboxing chỉ hoạt động khi sử dụng double làm đối số, thêm nó vào bộ sưu tập và tương tự. Hãy thử khai báo double x và sau đó hỏi x với isNaN () - cho tôi một lỗi trình biên dịch.
Carl

Thực sự, tôi nghi ngờ Andrew chỉ bỏ lỡ phím shift gõ "double" đầu tiên.
Carl

14

Bạn có thể muốn xem xét cũng kiểm tra nếu một giá trị là hữu hạn thông qua Double.isFinite(value). Vì Java 8 có một phương thức mới trong Doublelớp nơi bạn có thể kiểm tra cùng một lúc nếu một giá trị không phải là NaN và vô cùng.

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

Bạn có thể kiểm tra NaN bằng cách sử dụng var != var. NaNkhông bằng nhau NaN.

EDIT : Đây có lẽ là phương pháp tồi tệ nhất. Thật khó hiểu, khủng khiếp cho khả năng đọc và thực hành xấu tổng thể.


3
Ai đó có thể giải thích downvote? Tôi biết, cách này rất tệ, và isNantốt hơn cho khả năng đọc, nhưng nó hoạt động, phải không? Và isNanphương pháp sử dụng điều này để kiểm tra NaN.
HyperNeutrino

1
Tôi đoán downvote là vì cách này rất tệ và isNaN tốt hơn cho khả năng đọc.
Edward Falk

1
Tôi đã không đánh giá thấp bạn, nhưng tôi nghĩ nhận xét bổ sung sẽ hữu ích ở đây: nếu bạn so sánh các trình bao bọc như Float hoặc Double thì cuối cùng bạn so sánh các tham chiếu theo cách này, không phải là giá trị của chúng, đó chắc chắn không phải là điều bạn muốn.
Battle_Slug 3/03/2016

3
@Battle_Slug Cảm ơn bạn đã bình luận. Tôi biết rằng đây là một ý tưởng rất tồi, nhưng tôi đã đặt nó ở đây cho đầy đủ.
HyperNeutrino

isNaNĐiều này dưới mui xe, nhưng làm thế nào nó hoạt động? Làm thế nào mà một cái gì đó không bằng chính nó ??
wilmol

0

Người mới bắt đầu cần những ví dụ thực tế. vì vậy hãy thử đoạn mã sau.

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
Ví dụ này làm quá nhiều và không rõ bạn đang cố gắng thể hiện điều gì. Đây chỉ là một loạt các mã phân mảnh.
Jared Hooper

3
Là OP, người mới bắt đầu khi câu hỏi này được hỏi lại trong '09, tôi có thể đảm bảo với bạn rằng câu trả lời được chấp nhận hữu ích hơn nhiều so với ví dụ "thực tế" này.
Eric Wilson

Cảm ơn bạn @pggajendra babu đã đăng mã ví dụ này.
datnt

0

Đoạn mã dưới đây sẽ giúp đánh giá loại nguyên thủy giữ NaN.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.