4

这个问题说明了一切。我有一系列双打,正在用它们做点什么。

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

4

5 回答 5

5

在 Java 中,您可以通过使用获取 NaN

Double.NaN

所以你可以把它放到你的数组中。

如果您的问题是如何检查某物是否为 NaN,您可以致电

Double.isNan(/* ... value ... */);
于 2011-02-07T01:28:07.180 回答
4

您必须明确地对其进行测试,因为NaN != NaN您不能只将它包含在您的数组中。你必须使用Double.isNaN(x).

于 2011-02-07T01:27:40.833 回答
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.
}
于 2011-02-07T01:26:36.337 回答
0

由于在许多语言中 NaN 不等于自身(在 Java 中也是如此),因此您应该将其作为特定情况处理。使用 Float.NaN 或 Double.NaN 来引用 NaN。使用 Float.isNaN 或 Double.isNaN 检查特定值是否为 NaN。

于 2011-02-07T01:29:35.770 回答
0

在这种情况下,对象实际上比原始sDouble更有用。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实际上实现了equals契约的反身条件,意思是Double.valueOf(Double.NaN).equals(Double.valueOf(Double.NaN))给出true,相反Double.NaN != Double.NaN

于 2011-02-07T14:39:56.213 回答