我试图用Integer作为HashMap的索引来保存一些Double值。 我的问题是我在Map中有一些NaN值,这很奇怪,因为正如你在下面的代码中看到的那样,如果它是NaN,我会打印出错误。 即使我的Map中有一些NaN值,也从不调用println函数。 函数compareDocs返回Double。
HashMap<Integer, Double> distVec = new HashMap<Integer, Double>();
int i = 0;
for (IGSDocument doc : train) {
Double dist = compareDocs(test, doc);
if(dist == Double.NaN){
System.err.println("Not a Number");
}
distVec.put(i, dist);
i++;
}
System.out.println(distVec);
有没有人看到我的错?
答案 0 :(得分:3)
NaN
不等于它自己(它不等于任何),所以dist == Double.NaN
总是假的。使用
if(!dist.isNaN()) {
distVec.put(i, dist);
++i;
}
或
if(!Double.isNaN(dist)) {
distVec.put(i, dist);
++i;
}
后者也适用于double dist
。
旁注:由于NaN
是唯一与自身不相等的数字,
if(dist == dist) {
...
}
也适用于double dist
(但不太漂亮)。我不建议您使用它(它无论如何都不能使用对象类型Double
),但它说明了工作中的机制。
答案 1 :(得分:1)
试用Double包装类的isNan方法,如:
dist.isNan()
而不是与&#34; ==&#34;因为NaN不等于自己。另外一件事,你的if语句:
if(dist == Double.NaN){
System.err.println("Not a Number");
}
即使使用新方法,您也会捕获Nan,但这不会再阻止您进入hashMap。所以你应该改变你的if:
if(dist.isNaN()){
System.err.println("Not a Number");
continue;//continue with other values and ignore NaN
}