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

Eri*_*son 274 java double equality nan

我有一个Java的双倍,我想检查它是否是NaN.做这个的最好方式是什么?

Ben*_*n S 459

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

// 1. static method
if (Double.isNaN(doubleValue)) {
    ...
}
// 2. object's method
if (doubleObject.isNaN()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

简单地做:

if (var == Double.NaN) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 另一种方法是v!= v.只有NaN将false与自身进行比较.不要这样做,isNaN要好一百万倍.:) (50认同)
  • 这不适合我.Double.isNaN(var)工作了 (8认同)
  • @Joren,迟到总比没有好:'isNaN'确实比v!= v更好用于可读性.但isNaN方法的源代码与说v!= v完全相同.源:static public boolean isNaN(double v){return(v!= v); } (4认同)

And*_*are 45

试试Double.isNaN():

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

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


Grz*_*jos 12

您可能还想考虑检查值是否为有限值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)
Run Code Online (Sandbox Code Playgroud)


Hyp*_*ino 9

您可以使用检查NaN var != var.NaN不相等NaN.

编辑:这可能是迄今为止最糟糕的方法.这令人困惑,可读性和整体糟糕的做法都很糟糕.

  • 有人可以解释一下downvote吗?我知道,这种方式非常糟糕,`isNan`更易于阅读,但它有效,对吧?并且`isNan`方法使用它来检查`NaN`. (3认同)
  • @Battle_Slug感谢您的评论.我知道这是一个非常糟糕的主意,但我把它放在这里是为了完整. (3认同)