日期:2014-05-20  浏览次数:21196 次

初学java,float类型问题,请教各位大虾
1. which three are valid declaraction of a float? 
  A. float foo=-1; 
  B. float foo=1.0; 
  C. float foo=42e1; 
  D. float foo=2.02f; 
  E. float foo=3.03d; 
  F. float foo=0x0123; 

2. float f=4.2F; 
  Float g=new Float(4.2F); 
  Double d=new Double(4.2); 
  Which are true? 
  A. f==g  
  B. g==g  
  C. d==f  
  D. d.equals(f)  
  E d.equals(g)  
  F. g.equals(4.2);


每一个选项是对是错?原因是什么?
在编译器里当然可以得出结果,但是不知道原因,麻烦各位了!

------解决方案--------------------
1. which three are valid declaraction of a float?
A. float foo=-1; // 必须在数字后加f或F,如1.23f
B. float foo=1.0;//小数默认为double ,必须在数字后加f或F,如1.23f
C. float foo=42e1;//必须在数字后加f或F,如1.23f
D. float foo=2.02f; √ 
E. float foo=3.03d; //d 应该是double类型的 
F. float foo=0x0123;

2. float f=4.2F;
Float g=new Float(4.2F);
Double d=new Double(4.2);
Which are true?
A. f==g // X , f 为基本数据类型float的变量 ,g为 float包装类Float的一个对象引用
B. g==g // 对
C. d==f //X ,两个对象的引用 
D. d.equals(f) //X ?
E d.equals(g) //X ?
F. g.equals(4.2);//X ?

? public boolean equals(Object obj)
其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.




------解决方案--------------------
而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

------解决方案--------------------
第一题:
A-E: 整数字面量默认为int,浮点数字面量默认为double,而不丢失精度的向上转型是允许的,向下转型需要强制转换。
F:编译器允许直接用二进制给float赋值
第二题:
A-C:对引用类型使用==运算符比较的是是否引用同一个对象,请参照c的指针变量来理解。
D-F:请去读API文档

------解决方案--------------------
你去我博客看看我的文章,我对浮点数做了比较深入的分析。单精度和双精度是不同格式来表达的,在内存里面也是不同的数字,;例如0.9,单精度和双精度在内存里就表示的是两个不同的数了(因为精度不同)。至于==这个运算符,如果你理解内存的话还好理解。==比较的是内存地址其实这个说法不一定正确的,java为了跨平台,内存地址不是真的内存地址,而是有一种哈希码来构成的对象地址的。比如 int i =1; Integer it=
new Integer(1);如果从内存地址解释 i==it的话,应该是不是true的,但是事实却是true。这是因为==比较的是跟哈希码的东西。it的哈希码也是1,具体的==运算不好说。
------解决方案--------------------
探讨
1. which three are valid declaraction of a float?
A. float foo=-1;
B. float foo=1.0;
C. float foo=42e1;
D. float foo=2.02f;
E. float foo=3.03d;
F. float foo=0x0123;

2. floa……

------解决方案--------------------
探讨
f==g: true
g==g: true
d==f: false
d.equals(f): false
d.equals(g): false
g.equals(4.2): false
f==d: false

------解决方案--------------------
探讨
1. which three are valid declaraction of a float?
A. float foo=-1; // 必须在数字后加f或F,如1.23f
B. float foo=1.0;//小数默认为double ,必须在数字后加f或F,如1.23f
C. float foo=42e1;//必须在数字后加f或F,如1.23f
D. float foo=2.02f; √
E. float foo=3.03d; //d 应该是double类型的
F. float foo=0x0123;