如何在数组中表示NaN?

时间:2011-02-07 01:21:18

标签: java nan

这个问题说明了一切。我有一系列双打并且正在与他们做点什么。

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

5 个答案:

答案 0 :(得分:5)

在Java中,您可以使用

获取NaN
Double.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相反。