Java中Double、Float类型的NaN和Infinity

Java中Double、Float类型的NaN和Infinity

前言

Java在处理浮点数运算时,提供了NaN和Infinity两个常量

一、NaN

(1)、NaN的定义:

 public static final double NaN = 0.0d / 0.0;
 
 public static final float NaN = 0.0f / 0.0f;

(2)、NaN的测试
double类型测试:

 double a = 0.0d / 0.0; //NaN
 double b = 0.0d / 0.0; //NaN
 System.out.println(a != a); //true
 System.out.println(a != b); //true
 System.out.println(Double.isNaN(a)); //true

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

包装类Double类型测试:

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

可以看出,包装类型Double通过"=="比较和自己是相等的,和其他NaN不相等;
通过"equals"比较是,和自己相等,和其他NaN也相等。

NaN值的类型强转测试:

double a = 0.0d / 0.0; //NaN
long b = (long) a; //0
int c = (int) a;  //0
float d = (float) a; //NaN

可以看出将NaN强转为int或long时,值变为了0;强转为float时,值仍为NaN。

二、Infinity

(1)、Infinity的定义

 public static final double POSITIVE_INFINITY = 1.0 / 0.0;
 public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

POSITIVE_INFINITY 和NEGATIVE_INFINITY 分别代表正无穷、负无穷

(2)、Infinity的测试
double类型的测试

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

基本类型的double,Infinity和自己相等,和其他的Infinity也相等。

包装类Double类型测试:

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也相等。

猜你喜欢

转载自blog.csdn.net/qq_43842093/article/details/130663988