NaN =“NaN”代表“不是数字”。如果浮点运算有一些输入参数导致操作产生一些未定义的结果,则会产生“Nan”。例如,0.0除以0.0是算术上未定义的。取负数的平方根也是未定义的。
我试图在Java中使用NaN Constant
public class NaNDemo {
public static void main(String s[]) {
double x = Double.NaN;
double y = Double.NaN;
System.out.println((x == y));
System.out.println("x=" + x);
System.out.println("y=" + y);
}
}
输出
false
x=NaN
y=NaN
那么为什么x == y是假的?
答案 0 :(得分:3)
NaN
是一个概念,而不是值或数字。由于该概念可以表示多个非实数值(虚数,0/0等),因此任何特定的NaN等于任何其他NaN都没有意义。
同样地,你不能说Double::NEGATIVE_INFINITY
等于它自己,因为无穷大也不是一个数字。
答案 1 :(得分:1)
如果任一操作数为NaN,则等于运算符==返回false。
JSL对NaN说:
- 如果其中一个或两个操作数均为NaN(§15.20.1),则数值比较运算符<,< =,>和> =返回false。
- 如果任一操作数为NaN,则等于运算符==返回false。
- 特别是,如果x或y为NaN,则(x = y)将为假。
- 如果任一操作数为NaN(§15.21.1),则不等式运算符!=返回true。
特别是,当且仅当x是NaN时,x!= x才为真。
答案 2 :(得分:0)
两个NaN
值不能相等。你不知道它们代表什么未定义的值。而且你也不知道它们是如何表示的。
引用JLS -
特殊号码
NaN (not-a-number)
是无序的并且具有 以下字符:
- 如果其中一个或两个操作数均为NaN,则数值比较运算符<,< =,>和> =始终返回false。
- 如果任一操作数为NaN,则等于运算符==返回false。
- 如果任一操作数为NaN,则不等式运算符!=返回true。
如果你这样定义: -
Double a = new Double(Double.NaN);
Double b = new Double(Double.NaN);
if (a == b) {
System.out.println("true"); /** You will get true **/
}
答案 3 :(得分:0)
NaN - 非数字在使用NAN数字进行操作时没有任何意义。所以不能相等。