Float.NaN == Float.NaN

2022-09-01 12:20:11

为什么这种比较会给我“假”?我查看了源代码,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;

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

System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));

它给了我.所以认为NaN等于自己!0Float.compare()


答案 1

用于检查 NaN 值。Float.isNaN


答案 2

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

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

def isNan(val):
     return val != val

推荐