Как вы проверяете, равно ли двойное значение NaN?

У меня есть дубль на Java, и я хочу проверить, NaN. Как лучше всего это сделать?


person Eric Wilson    schedule 21.09.2009    source источник


Ответы (7)


Используйте статический _1 _ или ваш Double .isNaN() метод.

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

Просто делаю:

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

недостаточно из-за того, что стандарт IEEE для NaN и чисел с плавающей запятой определяется.

person Ben S    schedule 21.09.2009
comment
Другой способ сделать это - v! = V. Только NaN сравнивает ложь с самим собой. Не делайте этого, isNaN в миллион раз лучше. :) - person Joren; 22.09.2009
comment
@Joren, лучше поздно, чем никогда: 'isNaN' действительно лучше использовать, чем v! = V для удобства чтения. Но исходный код метода isNaN в точности совпадает с выражением v! = V. Источник: статическое публичное логическое значение isNaN (double v) {return (v! = V); } - person Rolf ツ; 10.12.2014
comment
Double.isNaN should be (true) хороший ответ - person Oliver Shaw; 24.04.2015
comment
@Joren isNaN просто проверьте v! = V;) но это выглядит лучше - person Mr Jedi; 31.05.2015
comment
Использование Java 5: value == Double.NaN не работает, но Double.isNaN(value) работает нормально. - person iMassakre; 06.12.2016
comment
@Rolf Нет. Вы этого и ожидали, но это не так. d == Double.NaN никогда не будет истинным, даже если d равно NaN. Вы НЕ можете использовать его как метод проверки NaN, вы должны использовать isNaN - person ; 26.04.2017
comment
@Timo не уверен, что вы хотите здесь сказать. Источник isNan совпадает с утверждением v != v, при чем тут d == Double.NaN? - person Rolf ツ; 26.04.2017
comment
@Rolf, если быть точным, я говорю, что вы неправы. Подскажите, каков результат v! = V? - Обратите внимание, что v - это та же переменная - person ; 26.04.2017
comment
@Rolf Нет. Вы не можете использовать d == Double.NaN - это никогда не будет правдой. Докажите это себе с помощью кода, запустите этот System.out.println (Value = + (0.0 / 0.0) + Comparison to Nan = + ((0.0 / 0.0) == Double.NaN) + Comparison to Nan = + Double.isNaN) ((0,0 / 0,0))); Результат - ›Значение = NaN Сравнение с Nan = false Сравнение с Nan = true. - person ; 26.04.2017
comment
@Rolf NaN - допустимое ЗНАЧЕНИЕ типа double (базовый тип). IEEE настаивает (я полагаю), что любое сравнение с VALUE NaN всегда должно быть ложным, в том числе с самим. Что делает проверка NaN, так это сравнивает двойное значение с самим собой, и если оно возвращает false, то это должно быть NaN, потому что любое другое значение вернет true. compare (3,3) - ›true, compare (1,1) -› true ... и т.д ... compare (Nan, Nan) - ›false. Это должно быть единственное значение, которое делает это. Итак, OP мог искать NaN, говоря if (myValue! = MyValue) ... но это выглядит очень странно и isNan лучше, но == NaN будет никогда не работаю. - person ; 26.04.2017
comment
@Timo, Во-первых, я никогда не говорил, что d == Double.NaN будет работать. Во-вторых, v != v работает, потому что: A. В руководстве по стандарту Java сказано так и B. Метод isNaN использует это. - person Rolf ツ; 26.04.2017
comment
@Timo, я все еще не уверен, что вы здесь пытаетесь исправить. По сути, мы говорим то же самое, за исключением d == Double.NaN части, которую я никогда раньше не видел и не говорил. - person Rolf ツ; 26.04.2017

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

Возвращает true, если это значение Double не является числом (NaN), в противном случае - false.

Обратите внимание, что [double.isNaN()] не будет работать, потому что распакованные двойники не имеют связанных с ними методов.

person Andrew Hare    schedule 21.09.2009
comment
Я думал, что в Java нельзя вызывать методы примитивных типов. Это действительно должно быть Double.isNan(), а не double.IsNan(), верно? - person Joren; 22.09.2009
comment
Йорен, он полагается на автобокс (двойное преобразование в Double компилятором / средой выполнения); новая функция, начиная с версии 1.5. Небольшой риск идти в этом направлении; переход от Double к double создает риск NullPointerExceptions. - person M1EK; 22.09.2009
comment
Я думал, что автобокс работает только с использованием двойника в качестве аргумента, добавлением его в коллекцию и т. Д. Попробуйте объявить двойной x, а затем попросить x в isNaN () - выдает ошибку компилятора. - person Carl; 22.09.2009
comment
На самом деле, я подозреваю, что Эндрю просто пропустил клавишу Shift, набирая первую двойную. - person Carl; 22.09.2009

Возможно, вы захотите также проверить, является ли значение конечным, через 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)
person Grzegorz Gajos    schedule 29.06.2016

Вы можете проверить NaN, используя var != var. NaN не равно NaN.

РЕДАКТИРОВАТЬ: это, вероятно, худший метод. Это сбивает с толку, ужасно для удобочитаемости и в целом плохая практика.

person hyper-neutrino    schedule 11.10.2015
comment
Может кто-нибудь объяснить отрицательный голос? Я знаю, что это очень плохой способ и isNan лучше для читабельности, но он работает, верно? И метод isNan использует это для проверки NaN. - person hyper-neutrino; 12.10.2015
comment
Я предполагаю, что отрицательное голосование было вызвано тем, что этот способ очень плох, а isNaN лучше для удобочитаемости. - person Edward Falk; 22.01.2016
comment
Я не голосовал против вас, но я думаю, что здесь был бы полезен дополнительный комментарий: если вы сравниваете обертки, такие как Float или Double, вы в конечном итоге сравниваете ссылки, а не их значения, что определенно не то, что вам нужно. - person Battle_Slug; 03.03.2016
comment
@Battle_Slug Спасибо за комментарий. Я знаю, что это очень плохая идея, но я поместил ее здесь для полноты картины. - person hyper-neutrino; 04.03.2016
comment
isNaN делает это под капотом, но как это работает? Как что-то не равняется самому себе ?? - person wilmol; 08.07.2019
comment
методы пользовательского класса @wilmol - person hyper-neutrino; 08.07.2019
comment
метод? Вы про оператора? != оператор перегружен для класса Double? - person wilmol; 08.07.2019

Новичкам нужны практические примеры. поэтому попробуйте следующий код.

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
person p.g.gajendra babu    schedule 24.12.2014
comment
Этот пример делает слишком много, и непонятно, что вы пытались показать. Это просто набор фрагментированного кода. - person Jared Hooper; 07.09.2015
comment
Как ОП, который был новичком, когда этот вопрос был задан еще в 2009 году, я могу заверить вас, что принятый ответ был гораздо более полезным, чем этот практический пример. - person Eric Wilson; 28.09.2015
comment
Спасибо @ p.g.gajendra babu за размещение этого примера кода. - person datnt; 26.03.2017

Если ваше тестируемое значение является Double (не примитивным) и может быть null (что, очевидно, тоже не является числом), тогда вам следует использовать следующий термин:

(value==null || Double.isNaN(value))

Поскольку isNaN() требуется примитив (а не упаковка любого примитивного двойника в Double), передача значения null (которое не может быть распаковано в Double) приведет к исключение вместо ожидаемого false.

person PeterPainter    schedule 25.09.2020

Приведенный ниже фрагмент кода поможет оценить примитивный тип, содержащий NaN.

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

person Teela    schedule 21.08.2019