您如何测试以查看double是否等于NaN?


Answers:


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的IEEE标准和浮点数被定义。


51
另一种方法是v!= v。只有NaN自己比较false。但是不要这样做,isNaN的性能要好一百万倍。:)
Joren

5
@Joren,迟到总比没有好:在可读性方面,使用'isNaN'确实比使用v!= v好。但是,isNaN方法的源代码与说v!= v完全相同。源:静态公共布尔isNaN(double v){return(v!= v); }
罗尔夫(Rolf)2014年

1
Double.isNaN should be (true) 不错的答案
Oliver Shaw

@Joren isNaN只是检查v!= v;),但看起来更好
Jedi先生

使用Java 5:value == Double.NaN不起作用,但Double.isNaN(value)可以正常工作。
zero01alpha

45

尝试Double.isNaN()

如果此Double值是一个非数字(NaN),则返回true,否则返回false。

请注意[ double.isNaN()]将不起作用,因为未装箱的双打没有与之关联的方法。


我以为您不能在Java中的原始类型上调用方法。确实需要Double.isNan(),不是double.IsNan(),对吧?
Joren

Joren,他依靠自动装箱(double被编译器/运行时转换为Double);从1.5开始的新功能。朝这个方向冒险的风险很小;从Double变为double会产生NullPointerExceptions风险。
M1EK

我认为自动装箱只能将double用作参数,并将其添加到集合中,等等。尝试声明双精度x,然后要求x到isNaN()-给我一个编译器错误。
卡尔

真的,我怀疑安德鲁(Andrew)只是错过了键入第一个“ double”的Shift键。
卡尔

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 != varNaN不相等NaN

编辑:这可能是迄今为止最糟糕的方法。这很混乱,可读性很差,而且总体上还是不好的做法。


3
有人可以解释一下反对意见吗?我知道,这种方式非常不好,而且isNan可读性更好,但是行得通,对吧?然后该isNan方法使用此方法进行检查NaN
HyperNeutrino,2015年

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
这个例子做的太多了,还不清楚您要显示的内容。这只是一堆零碎的代码。
Jared Hooper 2015年

3
作为OP,他是09年问这个问题时的初学者,我可以向您保证,被接受的答案比这个“实际”示例要有用得多。
埃里克·威尔逊

感谢@pggajendra babu发布此示例代码。
datnt

0

下面的代码片段将有助于评估保留NaN的原始类型。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.