今天,偶然发现当double类型的数除以0的时候编译器竟然没有报错,运行结果为Infinity。
public static void main(String[] args) {
double a=5;
System.out.println(a/0);
}
结果为:
Infinity
我自己有点纳闷,因为这是我第一次遇到Infinity,差了一下才知道,它的意思就是无穷大。
我联想到Java中的另一个特殊的值NaN,我试着改变a的值,看是否能出现NaN。终于当我将a的值改变为0时,输出结果为NaN,即 0/0=NaN。
我又上网查了一下,发现了一些有趣的现象。
- 无穷大加1还是无穷大。
Java可以让一个float或double类型的值来表示无穷大。正如我们所知道的“无穷大加上一还是无穷大”。
double a = 1.0/0.0;
a的值为Infinity,即无穷大,也可以用标准类库中的常量表示:
floata=Float.POSITIVE_INFINITY;
或
doublea=Double.POSITIVE_INFINITY;
查看以下代码:
publicstatic void main(String[] args) {
floata=Float.POSITIVE_INFINITY;
if(a+1==a)
System.out.println(a);
}
运行结果为:Infinity
a+1是等于a的即无穷大加1还是无穷大。
- NaN不等于任何浮点数值,包括它自己。
浮点算术保留了一个特殊的值用来表示一个不是数字的数量即NaN。对于所有没有良好的数字定义的浮点计算,例如0.0/0.0,其值都是它。
double a = 0.0/0.0;
a的值为NaN,即a不是数字,也可以用标准类库中的常量表示:
floata=Float.NaN;
或
doublea=Double.NaN;
查看以下代码:
publicstatic void main(String[] args) {
floata=Float.NaN;
if(a!=a)
System.out.println(a);
}
输出结果为:NaN
NaN不等于任何浮点数的值包括它自己。
- 任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。
查看以下代码:
publicstatic void main(String[] args) {
floata=Float.NaN;
System.out.println(a+10);
}
输出结果为:NaN
NaN与任何数进行运算,结果均为NaN。
- NaN与任何数做“==”比较,结果均为false。
查看以下代码:
publicstatic void main(String[] args) {
floata=Float.NaN;
if(a==0) {
System.out.println("NaN=0");
}else{
System.out.println("NaN!=0");
}
}
输出结果为:NaN!=0
Double.NaN == Double.NaN;结果为false
- Float.compare()和Double.compare()
当我们使用Float.compare()或Double.compare()比较两个NaN时,会得到相等的结果。
publicstatic void main(String[] args) {
floata=Float.NaN;
floatb=Float.NaN;
System.out.println(Float.compare(a,b));
}
输出结果为:0
compare()方法如果返回0,就说明两个数相等,返回-1,就说明第一个比第二个小,返回1则正好相反。
一般来说,基本类型的compare()方法与直接使用==的效果“应该”是一样的,但在NaN这个问题上不一致。
还有:
publicstatic void main(String[] args) {
floatnegZero=-0.0f;
floatzero=0.0f;
System.out.println(zero==negZero);
System.out.println(Float.compare(zero,negZero));
}
结果为:
true
1
即==认为正0和负0相等,而compare()方法认为正0比负0要大。