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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fengche 中级黑马   /  2013-10-18 07:25  /  1190 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fengche 于 2013-10-18 10:32 编辑

public class Transitive {
    public static void main(String[] args) throws Exception {
        long x = Long.MAX_VALUE;
        double y = (double) Long.MAX_VALUE;
        long z = Long.MAX_VALUE - 1;
        System.out.print((x == y) + " "); // true!
        System.out.print((y == z) + " "); // true!
        System.out.println(x == z);        // false!
    }
}
y和z为什么相等了? 既然x==y且y==z都为true 为什么x==z为false

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

4 个回复

倒序浏览
FFF 金牌黑马 2013-10-18 08:24:59
沙发
long类型x=9223372036854775807
double类型y=9.223372036854776E18
long类型z=9223372036854775806

x!=z=true
至于为什么x=y,y=z
请看以下代码:
  1. public class FloatTest1 {  
  2.     public static void main(String[] args) {  
  3.         int intMax = Integer.MAX_VALUE;  
  4.         float fintMax = intMax;  
  5.          
  6.         int intMin = Integer.MIN_VALUE;  
  7.         float fintMin = intMin;  
  8.          
  9.         long longMax = Long.MAX_VALUE;  
  10.         double dlongMax = longMax;  
  11.          
  12.         long longMin = Long.MIN_VALUE;  
  13.         double dlongMin = longMin;  
  14.          
  15.         System.out.println("int类型的最大值是:" + intMax);  
  16.         System.out.println("使用float存储后为:" + fintMax);  
  17.         System.out.println("int类型的最小值是:" + intMin);  
  18.         System.out.println("使用float存储后为:" + fintMin);  
  19.         System.out.println("long类型的最大值是:" + longMax);  
  20.         System.out.println("使用float存储后为:" + dlongMax);  
  21.         System.out.println("long类型的最小值是:" + longMin);  
  22.         System.out.println("使用float存储后为:" + dlongMin);  
  23.     }  
  24. }  
  25.   
  26. // 运行结果:  
  27. // int类型的最大值是:2147483647  
  28. // 使用float存储后为:2.14748365E9  
  29. // int类型的最小值是:-2147483648  
  30. // 使用float存储后为:-2.14748365E9  
  31. // long类型的最大值是:9223372036854775807  
  32. // 使用float存储后为:9.223372036854776E18  
  33. // long类型的最小值是:-9223372036854775808  
  34. // 使用float存储后为:-9.223372036854776E1
复制代码
浮点数只是近似的存储
从结果为我们得知,无论是使用float类型的变量来存储数值,还是用double类型的变量来存储数值,都损失了一定的精度,在使用浮点数来输出时,都未能输出准确的结果。

评分

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

查看全部评分

回复 使用道具 举报
哈哈哈哈
回复 使用道具 举报
运行这个代码可以看出来,其实x和z相差1,必然不等,而y是浮点型,将最大的正整数转成浮点型以后,他的有效数字只有15个,所以只要和MAX_VALUE的前15位相等,就会被判断为true。
public class Transitive {
        public static void main(String[] args) throws Exception {
        long x = Long.MAX_VALUE;
        double y = (double) Long.MAX_VALUE;
        long z = Long.MAX_VALUE - 1;
        System.out.println((x == y) + " "); // true!
        System.out.println((y == z) + " "); // true!
        System.out.println((x == z) + " ");        // false!
        
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("Z="+z);
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
这里的比较应该存在一个强制转化的问题,比如说long和double比较时候,会先把long转化成double再进行比较,,你可以把x y z,打出来看下结果就知道了,我也是根据结果猜的.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马