你如何测试双精度是否等于 NaN?

How do you test to see if a double is equal to NaN?

提问人:Eric Wilson 提问时间:9/22/2009 最后编辑:spongebobEric Wilson 更新时间:11/18/2021 访问量:229213

问:

我在 Java 中有一个双精度,我想检查它是否是. 最好的方法是什么?NaN

java 双重 相等 nan

评论


答:

52赞 Andrew Hare 9/22/2009 #1

试试 Double.isNaN()

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

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

评论

0赞 Joren 9/22/2009
我以为你不能在 Java 中对原始类型调用方法。它真的需要而不是,对吧?Double.isNan()double.IsNan()
0赞 M1EK 9/22/2009
Joren,他依赖于自动装箱(编译器/运行时将 double 转换为 Double);从 1.5 开始的新功能。朝这个方向走的风险很小;从 Double 到 double 会产生 NullPointerExceptions 的风险。
0赞 Carl 9/22/2009
我以为自动装箱只适用于使用double作为参数,将其添加到集合中,等等。尝试声明双精度 x,然后要求 x 到 isNaN() - 给我一个编译器错误。
0赞 Carl 9/22/2009
真的,我怀疑安德鲁只是错过了输入第一个“double”的shift键。
526赞 Ben S 9/22/2009 #2

使用静态 Double.isNaN(double) 方法或 的 .isNaN() 方法。Double

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

简单地做:

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

由于 NaN 和浮点数的 IEEE 标准是如何定义的,因此是不够的

评论

54赞 Joren 9/22/2009
另一种方法是 v != v。只有 NaN 将 false 与自身进行比较。不过不要那样做,isNaN 要好一百万倍。:)
5赞 Rolf ツ 12/11/2014
@Joren,迟到总比没有好:'isNaN'确实比 v != v 更好读。但是 isNaN 方法的源代码和说 v != v 完全一样。源码: static public boolean isNaN(double v) { return (v != v);
1赞 Oliver Shaw 4/25/2015
Double.isNaN should be (true) 不错的答案
1赞 Mr Jedi 5/31/2015
@Joren isNaN 只需检查 v != v ;)但它看起来更好
0赞 secondbreakfast 12/7/2016
使用 Java 5:不起作用,但工作得很好。value == Double.NaNDouble.isNaN(value)
-3赞 p.g.gajendra babu 12/24/2014 #3

初学者需要实际的例子。因此,请尝试以下代码。

public class Not_a_Number {

public static void main(String[] args) {
    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

评论

5赞 Jared Hooper 9/7/2015
这个例子做得太多了,不清楚你想展示什么。这只是一堆零碎的代码。
6赞 Eric Wilson 9/29/2015
作为 OP,当这个问题在 09 年被问到时,他还是一个初学者,我可以向你保证,公认的答案比这个“实际”的例子要有用得多。
1赞 Holger 2/10/2023
比提供一段充满不必要的东西的代码更糟糕的是,这是一段充满气馁的东西的代码。
10赞 hyper-neutrino 10/12/2015 #4

您可以使用 检查 NaN。 不等于.var != varNaNNaN

编辑:这可能是迄今为止最糟糕的方法。它令人困惑,可读性很差,而且整体做法很糟糕。

评论

3赞 hyper-neutrino 10/13/2015
有人可以解释反对票吗?我知道,这种方式非常糟糕,并且更有利于可读性,但它有效,对吧?该方法使用它来检查 .isNanisNanNaN
1赞 Edward Falk 1/23/2016
我猜反对票是因为这种方式非常糟糕,而 isNaN 的可读性更好。
1赞 Battle_Slug 3/3/2016
我没有对你投反对票,但我认为额外的评论在这里会很有用:如果你比较像 Float 或 Double 这样的包装器,你最终会以这种方式比较引用,而不是它们的值,这绝对不是你想要的。
3赞 hyper-neutrino 3/4/2016
@Battle_Slug感谢您的评论。我确实知道这是一个非常糟糕的主意,但我把它放在这里是为了完整起见。
0赞 wilmol 7/8/2019
isNaN这在引擎盖下是这样做的,但它是如何工作的?某物怎么不等于自己??
22赞 Grzegorz Gajos 6/29/2016 #5

您可能还需要考虑通过 检查值是否有限。从 Java 8 开始,类中有一个新方法,您可以立即检查值是否不是 NaN 和无穷大。Double.isFinite(value)Double

/**
 * 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)
0赞 Teela 8/21/2019 #6

下面的代码片段将有助于评估保存 NaN 的基元类型。

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

评论

1赞 Holger 2/10/2023
永远不需要写,就像已经写的时候和什么时候一样。更短的是跳过从值到对象的不必要转换。condition? true: falseconditiontruetruefalsefalseDouble.isNaN(dbl)doubleDouble
1赞 PeterPainter 9/25/2020 #7

如果所测试的值是 Double(不是基元)并且可能是(这显然也不是数字),则应使用以下术语:null

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

由于想要一个基元(而不是将任何基元 double 装箱到 Double),因此传递一个值(不能将其取消装箱到 Double)将导致异常而不是预期的 .isNaN()nullfalse