浅谈Java中的NAN与INFINITY:数值迷失与无限可能

在Java中,NAN(Not-a-Number)INFINITY(无穷大)是浮点数类型(float和double)的特殊值,用于表示特定的数值情况。以下是关于NAN和INFINITY的详细解释和示例代码:

1、NAN

NAN是一个特殊的浮点数值,表示无效或未定义的数值结果。它通常出现在无法进行有效计算或产生无法表示的结果时。例如,0.0除以0.0或负数的平方根等操作都会产生NAN。

基本类型示例代码

double a = 0.0 / 0.0;  // 产生NAN
double b = 0.0 / 0.0;  // 产生NAN
double c = 0.0 / 0.0;  // 产生NAN
System.out.println(a);  // 输出: NaN
System.out.println(a!=a);  // 输出: true
System.out.println(a!=b);  // 输出: true
System.out.println(a!=c);  // 输出: true
System.out.println(Double.isNaN(a));  // 输出: true

 结论:对于基本类型,NaN和自己是不相等的,NaN和任何值都不相等,可以通过Double.isNaN(a)的方式来判断是不是NaN,该方法实现也是通过v != v来判断的

包装类型示例代码

double b = 0.0d / 0.0; //NaN
Double c = 0.0d / 0.0; //NaN
Double d = 0.0d / 0.0; //NaN
System.out.println(Double.isNaN(c)); //true
System.out.println(Double.isNaN(d)); //true
System.out.println(c == c); //true
System.out.println(c == d); //false
System.out.println(c == b); //false
System.out.println(c.equals(c)); //true
System.out.println(c.equals(d)); //true
System.out.println(c.equals(b)); //true

结论:对于包装类型,通过"=="比较和自己是相等的,和其他NaN不相等;
通过"equals"比较是,和自己相等,和其他NaN也相等。

2、INFINITY(无穷大):

INFINITY表示一个超出浮点数范围的数值,可以是正无穷大(+INFINITY)或负无穷大(-INFINITY)。它通常出现在数值溢出或除以0的情况下。

基本类型示例代码

double a = 1.0 / 0.0; //Infinity
double b = 1.0 / 0.0; //Infinity
System.out.println(Double.isInfinite(a)); //true
System.out.println(a == a); //true
System.out.println(a == b); //true

结论: 对于基本类型Infinity和自己相等,和其他的Infinity也相等

包装类型示例代码

double b = 1.0 / 0.0; //Infinity
Double c = 1.0 / 0.0; //Infinity
Double d = 1.0 / 0.0; //Infinity
System.out.println(Double.isInfinite(c)); //true

System.out.println(c == c); //true
System.out.println(c == d); //false
System.out.println(c == b); //true

System.out.println(c.equals(c)); //true
System.out.println(c.equals(d)); //true
System.out.println(c.equals(b)); //true

结论:包装类型Double的Infinity,通过"=="比较和自己是相等的,和其他包装类型的Infinity不相等,但是和其他基本类型的Infinity是相等的;
通过"equals"比较是,和自己相等,和其他Infinity也相等

你可能感兴趣的:(java,jvm,开发语言)