public class Guess {
public static void main(String[] args){
<sometype> x = <somevalue>;
System.out.println(x == x);
}
}
我必须更改sometype和somevalue以使其返回false?有可能吗?
答案 0 :(得分:15)
一:
float x = Float.NaN;
二:
double x = 0.0/0.0;
为什么?
正如此处所述,NaN
永远不会与另一个NaN
相等 - 请参阅http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
那为什么这不会返回false?
Float x = Float.NaN;
答案是,这里有一个引用赋值,而不是原始赋值。并且在后台有一个小自动拳击。这等于:
Float x = new Float(Float.NaN);
等于:
Float x = new Float(0.0f / 0.0f);
这里x是对Float对象的引用,==运算符测试引用相等,而不是值。
要看到这个返回false,测试应该是:
x.doubleValue()==x.doubleValue();
确实会返回false
答案 1 :(得分:3)
是的,有可能,您需要使用:
// Edited for primitives :)
float x = Float.NaN;
// or
double x = Double.NaN;
这是因为NaN是一个与自身不相同的特殊情况。
来自JLS(4.2.3):
NaN是无序的,因此如果其中一个或两个操作数都是NaN(§15.20.1),则数值比较运算符&lt;,&lt; =,&gt;和&gt; =返回false。如果任一操作数是NaN,则等于运算符==返回false,如果任一操作数是NaN(第15.21.1节),则不等式运算符!=返回true。特别是,当且仅当x是NaN时,x!= x才为真,如果x或y是NaN,则(x = y)将为假。
答案 2 :(得分:0)
我无法想到任何 someType
和someValue
您可能会x == x
出现错误,抱歉。
<强>更新强>
哦......是的,我认为NAN等于没有,甚至本身。所以......
double
和Double.NaN
(或左右)。
答案 3 :(得分:0)
这将打印false:
!(x == x)
除此之外,如果您使用NaN
,它只会打印为falsefloat x = float.NaN;
Console.WriteLine(x == x);