• 一个令我十分费解的java问题(Updated)

    日期:2009-04-10 | 分类:Playing With Technology

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://keilt.blogbus.com/logs/37689007.html

    今天做了一些J2SE的工作,有一个计算结果反复尝试都不能得到正确的值,在接近崩溃的调试过程中,我偶然发现了一个很让我非常费解的现象,两个形式相同的double值和String值(比如说String的"0.0"和double的0.0),全部转化为String后进行比较,竟然得不到正确的结果,但是全部转化为double后比较,就可以得到正确的结果.

    看一段代码,我特登人为制造了上面两种情况:

    public static void main(String[] args) {
        // 首先定义两个变量,一个double 0.0,一个String 0.0
        double a = 0.0;
        String b = "0.0";
        // 然后,将double值转成String,再和另一个String比较
        String c = String.valueOf(a);
        // 先打印出两个String看看
        System.out.println(b);
        System.out.println(c);
        // 进行比较
        if (c == b)
            System.out.println("OK");
        else
            System.out.println("???");

        System.out.println();

        // 接着,把String转成double,再和另一个double比较
        Double d = Double.parseDouble(b);
        // 先打印出两个double看看
        System.out.println(a);
        System.out.println(d);
        // 进行比较
        if (a == d)
            System.out.println("OK");
        else
            System.out.println("???");

        System.out.println();
        // 再直接新建一个String的"0.0"用于比较
        String e = "0.0";
        System.out.println(e);
        System.out.println(b);
        if (e == b)
            System.out.println("OK");
        else
            System.out.println("???");
    }

     

    看看运行后输出:

    0.0
    0.0
    ???

    0.0
    0.0
    OK

    0.0
    0.0
    OK

    就是这三个不同结果,非常让我费解,两个String值(b和c)输出都是"0.0",但是却不相等,直接新建两个"0.0"的String经行比较,是相等的,转成double比较,也是相等的,问题肯定出在Double.parseDouble()上,but, WHY???

    有高人能解释一下,鄙人将十分感谢!

    p.s. 我的环境是openSUSE 11.1, Eclipse for J2EE 3.4.2, Eclipse Modeling Tools, Java EE 5 SDK Update 6 with JDK for Linux. 不会是和环境有关吧.


    收藏到:Del.icio.us




    评论

  • java中 String 类型特殊 只有字符串 进行了改变才产生 新的引用对象
    你这样声明:String a = "a"; String b="a";这样的话 以为 "a"都是一样的 所以 jdk不会去重新 开辟一份空间 自然 a的引用地址与b的是一样的 而==对引用变量来说 比较的就是 引用地址是否相同 所以 a==b 会返回true
    Mr. Kei回复hym说:
    tks
    2009-05-27 09:57:50
  • 人家java就是这么设计的,这当然不是bug,请虚心一点,骂街是不对的。

    回到这个问题,java里int、double、float等基本数据类型不是对象,而String是对象。对象的“==”判断的是两边是不是同一个对象,而不是两个对象是不是想等,判断两个String是不是想等要用"a.equals(b)"。
    Mr. Kei回复路过说:
    曾经有人这样跟我说过,但是为什么新建两个同样为"0.0"的String,然后用==去判断,可以得到正确结果呢?(代码已经改了,加入了这种情况),这也不是同一个对象啊.
    p.s. 我那是表达感情,没有骂街,anyway,改了.数据是大量的从文件中读取的,找了好久才发现是因为这个原因造成的错误,浪费我好长时间.
    p.s.2 我也没有说这是JDK的bug,仅仅是对这个现象感到十分费解
    2009-04-10 09:52:59