提问人:Eric Wilson 提问时间:9/22/2009 最后编辑:spongebobEric Wilson 更新时间:11/18/2021 访问量:229213
你如何测试双精度是否等于 NaN?
How do you test to see if a double is equal to NaN?
答:
52赞
Andrew Hare
9/22/2009
#1
试试 Double.isNaN()
:
如果此 Double 值是非数字 (NaN),则返回 true,否则返回 false。
请注意,[] 将不起作用,因为未装箱的双精度没有与之关联的方法。double.isNaN()
评论
0赞
Joren
9/22/2009
我以为你不能在 Java 中对原始类型调用方法。它真的需要而不是,对吧?Double.isNan()
double.IsNan()
0赞
M1EK
9/22/2009
Joren,他依赖于自动装箱(编译器/运行时将 double 转换为 Double);从 1.5 开始的新功能。朝这个方向走的风险很小;从 Double 到 double 会产生 NullPointerExceptions 的风险。
0赞
Carl
9/22/2009
我以为自动装箱只适用于使用double作为参数,将其添加到集合中,等等。尝试声明双精度 x,然后要求 x 到 isNaN() - 给我一个编译器错误。
0赞
Carl
9/22/2009
真的,我怀疑安德鲁只是错过了输入第一个“double”的shift键。
526赞
Ben S
9/22/2009
#2
使用静态 Double.isNaN(double) 方法或 的 .isNaN()
方法。Double
// 1. static method
if (Double.isNaN(doubleValue)) {
...
}
// 2. object's method
if (doubleObject.isNaN()) {
...
}
简单地做:
if (var == Double.NaN) {
...
}
由于 NaN 和浮点数的 IEEE 标准是如何定义的,因此是不够的。
评论
54赞
Joren
9/22/2009
另一种方法是 v != v。只有 NaN 将 false 与自身进行比较。不过不要那样做,isNaN 要好一百万倍。:)
5赞
Rolf ツ
12/11/2014
@Joren,迟到总比没有好:'isNaN'确实比 v != v 更好读。但是 isNaN 方法的源代码和说 v != v 完全一样。源码: static public boolean isNaN(double v) { return (v != v);
1赞
Oliver Shaw
4/25/2015
Double.isNaN should be (true)
不错的答案
1赞
Mr Jedi
5/31/2015
@Joren isNaN 只需检查 v != v ;)但它看起来更好
0赞
secondbreakfast
12/7/2016
使用 Java 5:不起作用,但工作得很好。value == Double.NaN
Double.isNaN(value)
-3赞
p.g.gajendra babu
12/24/2014
#3
初学者需要实际的例子。因此,请尝试以下代码。
public class Not_a_Number {
public static void main(String[] args) {
String message = "0.0/0.0 is NaN.\nsimilarly Math.sqrt(-1) is NaN.";
String dottedLine = "------------------------------------------------";
Double numerator = -2.0;
Double denominator = -2.0;
while (denominator <= 1) {
Double x = numerator/denominator;
Double y = new Double (x);
boolean z = y.isNaN();
System.out.println("y = " + y);
System.out.println("z = " + z);
if (z == true){
System.out.println(message);
}
else {
System.out.println("Hi, everyone");
}
numerator = numerator + 1;
denominator = denominator +1;
System.out.println(dottedLine);
} // end of while
} // end of main
} // end of class
评论
5赞
Jared Hooper
9/7/2015
这个例子做得太多了,不清楚你想展示什么。这只是一堆零碎的代码。
6赞
Eric Wilson
9/29/2015
作为 OP,当这个问题在 09 年被问到时,他还是一个初学者,我可以向你保证,公认的答案比这个“实际”的例子要有用得多。
1赞
Holger
2/10/2023
比提供一段充满不必要的东西的代码更糟糕的是,这是一段充满气馁的东西的代码。
10赞
hyper-neutrino
10/12/2015
#4
您可以使用 检查 NaN。 不等于.var != var
NaN
NaN
编辑:这可能是迄今为止最糟糕的方法。它令人困惑,可读性很差,而且整体做法很糟糕。
评论
3赞
hyper-neutrino
10/13/2015
有人可以解释反对票吗?我知道,这种方式非常糟糕,并且更有利于可读性,但它有效,对吧?该方法使用它来检查 .isNan
isNan
NaN
1赞
Edward Falk
1/23/2016
我猜反对票是因为这种方式非常糟糕,而 isNaN 的可读性更好。
1赞
Battle_Slug
3/3/2016
我没有对你投反对票,但我认为额外的评论在这里会很有用:如果你比较像 Float 或 Double 这样的包装器,你最终会以这种方式比较引用,而不是它们的值,这绝对不是你想要的。
3赞
hyper-neutrino
3/4/2016
@Battle_Slug感谢您的评论。我确实知道这是一个非常糟糕的主意,但我把它放在这里是为了完整起见。
0赞
wilmol
7/8/2019
isNaN
这在引擎盖下是这样做的,但它是如何工作的?某物怎么不等于自己??
22赞
Grzegorz Gajos
6/29/2016
#5
您可能还需要考虑通过 检查值是否有限。从 Java 8 开始,类中有一个新方法,您可以立即检查值是否不是 NaN 和无穷大。Double.isFinite(value)
Double
/**
* Returns {@code true} if the argument is a finite floating-point
* value; returns {@code false} otherwise (for NaN and infinity
* arguments).
*
* @param d the {@code double} value to be tested
* @return {@code true} if the argument is a finite
* floating-point value, {@code false} otherwise.
* @since 1.8
*/
public static boolean isFinite(double d)
0赞
Teela
8/21/2019
#6
下面的代码片段将有助于评估保存 NaN 的基元类型。
double dbl = Double.NaN;
Double.valueOf(dbl).isNaN() ? true : false;
评论
1赞
Holger
2/10/2023
永远不需要写,就像已经写的时候和什么时候一样。更短的是跳过从值到对象的不必要转换。condition? true: false
condition
true
true
false
false
Double.isNaN(dbl)
double
Double
1赞
PeterPainter
9/25/2020
#7
如果所测试的值是 Double(不是基元)并且可能是(这显然也不是数字),则应使用以下术语:null
(value==null || Double.isNaN(value))
由于想要一个基元(而不是将任何基元 double 装箱到 Double),因此传递一个值(不能将其取消装箱到 Double)将导致异常而不是预期的 .isNaN()
null
false
评论