在Java中处理NaN的正确方法是什么?

11
例如,如果你正在计算精确度。
p = correct / total

请确保不要除以零:

double p;
if (total == 0.0) {
  p = 0.0;
}
else {
  p == correct / total;
}

或者检查一下是否得到了 NaN?

double p = correct / total;
if (Double.isNaN(p)) {
  p = 0.0;
}

这种方法是否有好处,还是纯属个人偏好?


由于glowcoders对我的评论的回复,我会考虑第二种形式,例如NaN / x - user166390
1个回答

8

我会使用第一种方法,但不是与0进行比较,而是比较 Math.abs(total) < TOLERANCE,其中TOLERANCE是一些小值,如0.0001。这将防止非常接近0的事物扭曲结果。


some_double / very_close_to_but_not_zero 可能会导致 NaN 吗?我不确定,但如果不会的话,直接使用等号(虽然在一般情况下有争议)似乎是适当的。 - user166390
不,它不会导致 NaN。但它会得出一个你可能不想要的答案。也许 "非常接近但不是零" 应该是零,但由于浮点数运算而最终不是零。*编辑:如果 some_doubleNaN,那么是的,但我确定这不是你的意思。 </edit> - corsiKa
那就是另一个问题了 :) 给你点赞,但这是我过去编写向量库时使用的一种情况,我使用了“== 0”(这是一个非常精确的要求) - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接