A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-21 02:23  /  1630 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-21 17:58 编辑
  1. public class Test {
  2.          
  3.     public static void main(String[] args) {

  4.             double i=0.0/0.0;   //首先为什么这里不会报除0异常?
  5.              if(i==i){
  6.              System.out.println("Yes i==i");
  7.              }else{
  8.              System.out.println("No i!=i");
  9.              }

  10.     }

  11. }

  12. //运行结果居然是  NO i!=i    这又是为什么,在内存中是怎样实现的?
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
double这玩意真心桑不起,谢谢各位了,以后对double要多加留意了
回复 使用道具 举报
我们都知道0.0/0.0是不对的,而计算机却用另一种形势来处理,也就是非数字NaN值常量,等于 Double.longBitsToDouble(0x7ff8000000000000L) 返回的值
所以if判断的时候i == i 判断为false
回复 使用道具 举报
double i=0.0/0.0;返回的结果是NaN,Not a Number。它是用于处理计算中出现的错误情况,既然不是数字所以就不能用==来判断,所以会返回else
回复 使用道具 举报
1、java提供的一个特殊的浮点数值用来表示出错---非数
0.0除以0.0或者对一个负数开方将得到非数,用过Double的NaN表示
2、NaN不与任何数值相等,甚至和NaN都不相等
i=NaN   //0.0除以0.0得到非数
NaN!=NaN  //两个非数是不相等的
回复 使用道具 举报
零在整数预算中不可以做除数,否则抛运行时异常。
零在浮点运算中可以做除数,返回值为无穷大(NaN)。
浮点型(Float或Double)的除法运算可以接受任何数值,并且结果总是返回一个浮点型的数值。这个数值可能是不合法的,需要进行判断和验证。
你可以这样验证 Double.isNaN(x)


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
参见Double类的常量Double.NaN  0.0/0.0会产生一个NaN对象你可以用Double类中的isNaN方法来验证
如果你用1/0.0的话它产生的就是一个POSITIVE_INFINITY 对象,第一个问题就是这样的。为什么这样规定我就不知道 了
至于为什么i==i 返回false的问题,我将你的代码重新改写成了Double i=0.0/0.0; ,这个时候打印的是true.
所以到这里我猜想是因为装箱和拆箱所引起的。所以我换成了1.4做实验,但是很遗憾1.4给的结果也是false。
但是如果是1/0.0,那么打印出来就是true。            
实际原因实在不是太清楚,但是我知道使用浮点数会很麻烦,所以能不用就不用。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在这里你得到的 i 在java中不是一个数值,而在java中 所有“非数值”的值都认为是不相同的
你应该这样 System.out.println(Double.idNaN(i)), 来检查 i 是否是一个number!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马