【Java】Java中的NAN解析,
【Java】Java中的NAN解析,
今天在学习集合框架的时候,看源码发现了一个不是很理解的问题(Float源码):
/**
* Returns {@code true} if the specified number is a
* Not-a-Number (NaN) value, {@code false} otherwise.
*
* @param v the value to be tested.
* @return {@code true} if the argument is NaN;
* {@code false} otherwise.
*/
public static boolean isNaN(float v) {
return (v != v);
}
判断isNan为什么是v != v ,what???这不是判断两个float是否相等么?
我们仔细看一下上面的注释:
如果指定的参数(float v入参)是NAN,返回true,否则就是false
NAN :Not-a-Number(不是一个数字)
从上面我们可以分析出来:意思就是两个NaN用==比较的结果会得到false。
校验一下:
float firstNan=Float.NaN;
float secoenNan=Float.NaN;
System.out.println("firstNan!=secoenNan = "+(firstNan!=secoenNan));
打印的结果:
firstNan!=secoenNan = true
到底什么是NAN?我们查阅一下资料,维基百科上得到如下的结果:
有点晦涩,下面我们具体讲解一下
1、什么是NAN?
简单地说,NaN是一个数字数据类型值,代表“不是数字”。NAN通常表示无效操作的结果,Java将float和double类型的NaN常量定义为Float .NaN和Double.NaN:
“ 持有类型为double的非数字(NaN)值的常量。它相当于Double.longBitsToDouble(0x7ff8000000000000L)返回的值。”
“保持float类型的非数字(NaN)值的常量。它等同于Float.intBitsToFloat(0x7fc00000)返回的值。”
我们猜一下下面的结果:
运行代码:
System.out.println("0 / 0 = " + (0 / 0));
是的,你猜对了ArithmeticException
输出结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.test.BaseTest.main(BaseTest.java:25)
现在猜猜输:
运行代码
System.out.println("0.0 / 0.0 = " + (0.0 / 0.0));
猜对了吗?
0.0 / 0.0 = NaN
double和float所有的,对于Java中的其他数值数据类型,我们没有这种类型的常量。
2、NAN的校验与比较
在java中编写代码时,我们应该注意检查输入是否有效且在预期范围内。在大多数情况下,NaN值不是有效输入。因此,我们应该验证输入值不是NaN值并适当地处理这些输入值。
NaN无法与任何浮动类型值进行比较。这意味着我们会得到虚假的涉及所有的比较操作的NaN(除“!=”为此我们得到真正的)。
测试代码如下
float Nan = Float.NaN;
System.out.println("(NaN == 1) = "+(Nan == 1));
System.out.println("(Nan > 1) = "+(Nan > 1));
System.out.println("(Nan < 1) = " + (Nan < 1));
System.out.println("(NaN != 1) = " + (Nan != 1));
System.out.println("(NaN == NaN) = " + (Nan == Nan));
System.out.println("(NaN > NaN) = " + (Nan > Nan));
System.out.println("(NaN < NaN) = " + (Nan < Nan));
System.out.println("(NaN != NaN) = " + (Nan != Nan));
得到结果如下;
(NaN == 1) = false
(Nan > 1) = false
(Nan < 1) = false
(NaN != 1) = true
(NaN == NaN) = false
(NaN > NaN) = false
(NaN < NaN) = false
(NaN != NaN) = true
在我们的代码中校验是否为NAN值,我们可以使用:Float.isNaN和Double.isNaN方法来检查这些值,这种方法易读易懂。、
3、isNan()和isInfinite()的区别
NaN:非数值类型;
Infinite:无穷大(包含正无穷大、负无穷大);
总结:
在Java的计算中,在执行涉及float和double类型的操作时,可能会产生NaN值。一些浮点方法和操作产生NaN值而不是抛出异常。我们可能需要明确处理这些结果,我们可以使用:Float.isNaN和Double.isNaN方法来检查;
相关文章
- 暂无相关文章
用户点评