Infinity和NaN

今天,偶然发现当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. 无穷大加1还是无穷大。

Java可以让一个floatdouble类型的值来表示无穷大。正如我们所知道的“无穷大加上一还是无穷大”。

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还是无穷大。

  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不等于任何浮点数的值包括它自己。

  1. 任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。

查看以下代码:

publicstatic void main(String[] args) {
floata=Float.NaN;
System.out.println(a+10);
}

输出结果为:NaN

NaN与任何数进行运算,结果均为NaN

  1. 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

  1. 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要大。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值