黑马程序员技术交流社区

标题: 你们都还记得这段代码不 [打印本页]

作者: 孟浩然    时间: 2012-6-5 14:02
标题: 你们都还记得这段代码不
  1. class NewDemo_06{
  2.        
  3.         public static void main(String args[]){
  4.                
  5.                
  6.         // ①       
  7.     double i=0.0/0.0;
  8.        
  9.         if(i==i){
  10.                
  11.                         System.out.println("i==i");
  12.         }
  13.        
  14.                 else{System.out.println("i!=i");
  15.         }
  16.        
  17.         //②
  18.         double j=2.0/0.0;
  19.        
  20.         if(j==j){
  21.                
  22.                         System.out.println("j==j");
  23.         }
  24.        
  25.                 else{System.out.println("j!=j");
  26.         }       
  27.         }
  28. }
复制代码

作者: 金鑫    时间: 2012-6-5 14:07
最终的结果是:
i!=i
j==j

WHY?疑惑中
作者: 孟浩然    时间: 2012-6-5 14:17
金鑫 发表于 2012-6-5 14:07
最终的结果是:
i!=i
j==j

其实在第一步里i就不是个数字的量,可以查一下Double.NaN,这个是针对浮点型数据的,只要是没有定义好的浮点型数据都会得到这个值,所以i!=i,至于什么是没有定义好,还要自己试吧。
作者: 郭宁    时间: 2012-6-5 14:22
j=2.0/0.0 = 无穷大 (无穷大也是个数字,自然可以比较)
i=0.0/0.0 = NaN = Not a Number (不是个数字了,你还杂比较)

作者: 孙峰    时间: 2012-6-5 14:30
我百了好久啊,对于第一个:为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。
第二个,没百着,应该这时候是个数值而且相等吧。
作者: 李春阳    时间: 2012-6-5 16:22
最怕这样看似简单滴- - 暗藏杀机




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2