Float.NaN == Float.NaN

shr*_*000 28 java floating-point comparison nan

为什么这种比较会让我"假"?我查看了源代码并将Float.NaN定义为

/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * <code>float</code>.  It is equivalent to the value returned by
 * <code>Float.intBitsToFloat(0x7fc00000)</code>.
 */
public static final float NaN = 0.0f / 0.0f;
Run Code Online (Sandbox Code Playgroud)

编辑:令人惊讶的是,如果我这样做:

System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));
Run Code Online (Sandbox Code Playgroud)

它给了我0.因此,Float.compare()不认为NaN的等于本身!

pen*_*cil 63

使用Float.isNaN检查NaN值.

  • +1更好的解决方案,但解释不佳! (6认同)
  • @Rolfツ没有什么可以补充的,这很简单. (2认同)

Voo*_*Voo 35

因为Java实现了IEEE-754浮点标准,它保证任何比较NaN都将返回false(除了!=返回true)

这意味着,您无法以通常的方式检查浮点数是否为NaN,因此您可以将这两个数字重新解释为整数并进行比较或使用更聪明的解决方案:

def isNan(val):
     return val != val
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用静态`Float.isNaN(float)`(Double也有它的版本). (19认同)
  • 除了`!=`比较,返回'true`. (5认同)
  • 你可以用这种方式测试NaN!如果`x == x`为假,则x为NaN. (3认同)