问题

我想知道这个问题是否可以用Java解决(我是语言新手)。这是代码:

class Condition {
    // you can change in the main
    public static void main(String[] args) { 
        int x = 0;
        if (x == x) {
            System.out.println("Ok");
        } else {
            System.out.println("Not ok");
        }
    }
}

我在我的实验室收到了以下问题:如何在不修改条件本身的情况下跳过第一种情况(即使得2242513905条件为假)?


#1 热门回答(169 赞)

一种简单的方法是使用Float.NaN

float x = Float.NaN;  // <--

if (x == x) {
    System.out.println("Ok");
} else {
    System.out.println("Not ok");
}
Not ok

你也可以用Double.NaN做同样的事情。

From**JLS§15.21.1。**数字平等运营商==!=

根据IEEE 754标准的规则执行浮点相等性测试:如果任一操作数为NaN,则==的结果为假,但!=的结果为真。实际上,当且仅当x的值是NaN时,测试x!= x才为真。 ...


#2 热门回答(157 赞)

int x = 0;
if (x == x) {
    System.out.println("Not ok");
} else {
    System.out.println("Ok");
}

#3 热门回答(147 赞)

Java Language SpecificationsNaN不等于NaN

因此导致x等于NaN的任何行都会导致这种情况,例如

double x=Math.sqrt(-1);

从Java语言规范:

浮点运算符不会产生例外(第11节)。溢出的操作产生有符号的无穷大,下溢的操作产生非规范化值或带符号的零,并且没有数学上确定结果的操作产生NaN。以NaN作为操作数的所有数值运算都会产生NaN。如已经描述的那样,NaN是无序的,因此涉及一个或两个NaN的数字比较操作返回false,并且涉及NaN的任何!=比较返回true,包括当x是NaN时x!= x。


原文链接