这个问题说明了一切。我有一系列双打并且正在与他们做点什么。
double expectedOutput[] = { 6.38792, 12.91079, 14.33333, 13.44517,
12.34539, 12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
-8.21610, -9.26719, -11.02378 };
理想情况下,我会测试是否
6.38792 == 6.38792
并最终获得“通过”
在某些条件下,我最终会遇到像
这样的情况6.38792 != NaN
有时候知道这是一个有效的案例,我如何在我的代码中代表NaN?
我要么将NaNs
包含在我的预期元素数组中,要么以某种方式弄清楚结果不是数字
我正在使用 Java
答案 0 :(得分:5)
在Java中,您可以使用
获取NaNDouble.NaN
所以你可以把它放到你的数组中。
如果您的问题是如何检查是否有NaN,您可以致电
Double.isNan(/* ... value ... */);
答案 1 :(得分:4)
你必须明确地测试它,因为NaN != NaN
,你不能只将它包含在你的数组中。您必须使用Double.isNaN(x)
。
答案 2 :(得分:1)
double d = 0.0/0.0;
if(Double.isNan(d)){
// Double d is not a number.
}
可替换地:
double d = Double.Nan;
if(Double.isNan(d)){
// Double d is not a number.
}
答案 3 :(得分:0)
由于在许多语言中NaN不等于它自己(在Java中也是如此),因此您应该将其作为特定情况处理。使用Float.NaN或Double.NaN引用NaN。使用Float.isNaN或Double.isNaN检查特定值是否为NaN。
答案 4 :(得分:0)
这是Double
个对象实际上比原始double
更有用的情况。
// auto-boxes them all to Double objects
Collection<Double> expectedOutput =
Arrays.asList(6.38792, 12.91079, 14.33333, 13.44517, 12.34539,
12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
-8.21610, -9.26719, -11.02378, Double.NaN );
// maybe fill into HashSet for more efficient lookup?
// later:
double d = Double.NaN;
if(expectedOutput.contains(d)) {
System.out.println("found");
}
原因是Double.equals
实际上实现了等于契约的反身条件,这意味着Double.valueOf(Double.NaN).equals(Double.valueOf(Double.NaN))
给出true
,与Double.NaN != Double.NaN
相反。