Infinity 与 NAN

System.out.println(5.0/0.0+''-"+0.0/0.0); 

正确的输出结果是Infinity-NaN

1.为什么不是java.lang.ArithmeticException: / by zero? 
       之所以没有报异常,是因为这是浮点的除法,也就是说0.0并不是真正意义上的0,它只不过是非常接近0而已,所以y一个数除以一个接近0的数,那么结果应为无穷大。而在java浮点范围内存在Infinity表示无穷大的概念。 
例如:System.out.println(3/0.0); 结果为Infinity 
2、NAN 
      浮点算术保留了一个特殊的值用来表示一个不是数字的数量,这个值就是NaN(“不是一个数字(Not a Number)”的缩写)。对于所有没有良好的数字定义的浮点计算,例如0.0/0.0,或者对负数求平方根其值都是它。例如: 
System.out.println(0.0/0.0); 
System.out.println(Math.sqrt(-6));
结果都为NAN 
规范中描述道,NaN 不等于任何浮点数值,包括它自身在内。 

3、Float.compare() 
而当我们使用Float.compare()这个方法来比较两个NaN时,却会得到相等的结果。可以用下面的代码验证: 
float nan=Float.NaN; 
float anotherNan=Float.NaN; 
System.out.println(Float.compare(nan,anotherNan));

compare()方法如果返回0,就说明两个数相等,返回-1,就说明第一个比第二个小,返回1则正好相反。 
上面语句的返回结果是0。 
一般来说,基本类型的compare()方法与直接使用==的效果“应该”是一样的,但在NaN这个问题上不一致,是利是弊,取决于使用的人作何期望。当程序的语义要求两个NaN不应该被认为相等时(例如用NaN来代表两个无穷大,学过高等数学的朋友们都记得,两个无穷看上去符号是一样,但不应该认为是相等的两样东西),就使用==判断;如果NaN被看得无足轻重(毕竟,我只关心数字,两个不是数字的东西就划归同一类好了嘛)就使用Float.compare()。

原文地址:https://www.cnblogs.com/acme6/p/7550272.html