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.
你去我博客看看我的文章,我对浮点数做了比较深入的分析。单精度和双精度是不同格式来表达的,在内存里面也是不同的数字,;例如0.9,单精度和双精度在内存里就表示的是两个不同的数了(因为精度不同)。至于==这个运算符,如果你理解内存的话还好理解。==比较的是内存地址其实这个说法不一定正确的,java为了跨平台,内存地址不是真的内存地址,而是有一种哈希码来构成的对象地址的。比如 int i =1; Integer it= new Integer(1);如果从内存地址解释 i==it的话,应该是不是true的,但是事实却是true。这是因为==比较的是跟哈希码的东西。it的哈希码也是1,具体的==运算不好说。
请看第二题编译器结果: java代码:public class Tcsdn { public static void main(String[] args) {
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.
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
A-E: 整数字面量默认为int,浮点数字面量默认为double,而不丢失精度的向上转型是允许的,向下转型需要强制转换。
F:编译器允许直接用二进制给float赋值
第二题:
A-C:对引用类型使用==运算符比较的是是否引用同一个对象,请参照c的指针变量来理解。
D-F:请去读API文档
new Integer(1);如果从内存地址解释 i==it的话,应该是不是true的,但是事实却是true。这是因为==比较的是跟哈希码的东西。it的哈希码也是1,具体的==运算不好说。
请看第二题编译器结果:
java代码:public class Tcsdn {
public static void main(String[] args) {
float f=4.2F;
Float g=new Float(4.2F);
Double d=new Double(4.2);
System.out.println("f==g: "+ (f==g));
System.out.println("g==g: "+ (g==g));
System.out.println("d==f: " +(d==f));
System.out.println("d.equals(f): "+d.equals(f));
System.out.println("d.equals(g): "+d.equals(g));
System.out.println("g.equals(4.2): "+g.equals(4.2));
System.out.println("f==d: "+ (f==d)); //我额外增加了一条,以便与第一条的“f==g”进行对比 }
}输出结果如下: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
g==g: true //自身和自身比较,
d==f: false // d可以自动拆包为d.doubleValue(),转换成基本类型double与float类型比较
d.equals(f): false //jdk1.6API中关于Double类中equals()函数的说明为:将此对象与指定对象比较。当且仅当参数不是 null 而是 Double 对象,且表示的 Double 值与此对象表示的 double 值相同时,结果为 true。
d.equals(g): false // 参见下条结果中的注释;
g.equals(4.2): false //虽然可以将4.2进行自动装包(装箱),但是装箱后仍是Double类型,如果比较的是g.equals(4.2f),那么结果为true
f==d: false //自动执行拆包,d.doubleValue(),float和double比较仍为false,如果手动将“f==d” 改为 “f==d.floatValue()”,即拆包成float类型的话,那么此语句结果也会为true
同学别忘了类型转换……
经过编译器权威测试,三个有效的应该为:float foo=-1; //正确 ,注意,在某些情况下int转换成float的时候可能会有精度损失
float foo=1.0; // X
float foo=42e1; // X
float foo=2.02f; //正确
float foo=3.03d; // X
float foo=0x0123; // 正确
以下是运行结果:
float foo1=-1; //正确
float foo2=1.0; //Type mismatch: cannot convert from double to float
float foo3=42e1;//Type mismatch: cannot convert from double to float
float foo4=2.02f; //正确
float foo5=3.03d; //Type mismatch: cannot convert from double to float
float foo6=0x0123; //正确
好像和你说的有差异哦 public static void main(String[] args) {
float f=4.2F;
Float g=new Float(4.2F);
Double d=new Double(4.2);
System.out.println(f==g);//true
System.out.println(g==g);//true
System.out.println(d==f);//false
System.out.println(d.equals(f));//false
System.out.println(d.equals(g));//false
System.out.println(g.equals(4.2));//false }
这个我没有了解得这么深入,看来得好好看看API了
System.out.println(f==g);//true
f 和 g 引用的不是同一个对象啊,为什么结果是true?