-
一个令我十分费解的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. 不会是和环境有关吧.随机文章:
发布Java简体中文分词组件 - KSeg4J 1.0 2009-07-03WordPress问题,解决方法与插件总结 2008-07-24原来,连大飞机也可以山寨 2009-05-30Cope with Unicode in MFC 2009-01-01ACM技巧(For amateur only) 2008-07-22
收藏到:Del.icio.us








评论
你这样声明:String a = "a"; String b="a";这样的话 以为 "a"都是一样的 所以 jdk不会去重新 开辟一份空间 自然 a的引用地址与b的是一样的 而==对引用变量来说 比较的就是 引用地址是否相同 所以 a==b 会返回true
回到这个问题,java里int、double、float等基本数据类型不是对象,而String是对象。对象的“==”判断的是两边是不是同一个对象,而不是两个对象是不是想等,判断两个String是不是想等要用"a.equals(b)"。
p.s. 我那是表达感情,没有骂街,anyway,改了.数据是大量的从文件中读取的,找了好久才发现是因为这个原因造成的错误,浪费我好长时间.
p.s.2 我也没有说这是JDK的bug,仅仅是对这个现象感到十分费解