Як ви перевіряєте, чи подвійний дорівнює NaN?


Відповіді:


475

Використовуйте статичний Double.isNaN(double)метод або ваш Double«S .isNaN()метод.

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

Просто робимо:

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

це НЕ є достатнім з - за того , як стандарт IEEE для NaN і чисел з плаваючою точкою визначається.


51
Інший спосіб зробити це було б v! = V. Тільки NaN порівнює хибне з собою. Не робіть цього, хочаNaN в мільйон разів кращий. :)
Джорен

5
@Joren, краще пізніше, ніж ніколи: 'isNaN' справді краще використовувати, ніж v! = V для читабельності. Але вихідний код методу isNaN точно такий же, як і слово v! = V. Джерело: статичний загальнодоступний логічний isNaN (подвійний v) {return (v! = V); }
Рольф ツ

1
Double.isNaN should be (true) приємна відповідь
Олівер Шоу

@Joren isNaN просто перевіримо v! = V;), але це виглядає краще
пан Джедай,

Використання Java 5: value == Double.NaNне працює, але Double.isNaN(value)працює чудово.
zero01alpha

45

Спробуйте Double.isNaN():

Повертає істину, якщо це подвійне значення - це не число (NaN), інакше помилково.

Зауважте, що [ double.isNaN()] не працюватиме, оскільки у безкольорових парних пар не є пов'язаних з ними методів.


Я думав, що ви не можете викликати методи на примітивних типах у Java. Це дійсно потрібно, Double.isNan()а ні double.IsNan(), правда?
Джорен

Джорен, він покладається на автобоксинг (подвійне перетворення в Double за допомогою компілятора / часу виконання); нова функція від 1,5 і більше. Маленький ризик піти в цьому напрямку; перехід від Double до Double створює ризик NullPointerExceptions.
M1EK

Я подумав, що автобоксинг працював лише над використанням подвійного в якості аргументу, додаванням його до колекції тощо. Спробуйте оголосити подвійний x, а потім попросити x to isNaN () - дає мені помилку компілятора.
Карл

Дійсно, я підозрюю, що Ендрю просто пропустив клавішу зміни, набравши перший "дубль".
Карл

14

Ви можете також розглянути можливість перевірки, чи значення кінцеве через Double.isFinite(value). Оскільки у Java 8 є новий метод у Doubleкласі, де ви можете одразу перевірити, чи не є значення NaN та нескінченність.

/**
 * 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 != var. NaNне дорівнює NaN.

EDIT : Це, мабуть, найгірший метод. Це заплутано, жахливо для читабельності та загальної поганої практики.


3
Чи може хтось пояснити сутичку? Я знаю, цей спосіб дуже поганий і isNanкращий для читабельності, але він працює, правда? І isNanметод використовує це для перевірки NaN.
HyperNeutrino

1
Я здогадуюсь, що голосування було в тому, що цей спосіб дуже поганий, і isNaN краще для читабельності.
Едвард Фолк

1
Я вас не оскаржував, але я думаю, що тут буде корисним додатковий коментар: якщо ви порівнюєте обгортки типу Float або Double, ви в кінцевому підсумку порівнюєте посилання таким чином, а не їх значення, що, безумовно, не те, що ви хочете.
Battle_Slug

3
@Battle_Slug Дякуємо за коментар. Я знаю, що це дуже погана ідея, але я викладаю її тут для повноти.
HyperNeutrino

isNaNце робиться під кришкою, але як це працює? Як щось не дорівнює собі ??
wilmol

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 році, я можу запевнити, що прийнята відповідь була набагато кориснішою, ніж цей «практичний» приклад.
Ерік Вілсон

Дякую @pggajendra babu за публікацію цього прикладу коду.
дат

0

Нижче наведений фрагмент коду допоможе оцінити примітивний тип утримання NaN.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.