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

新手求助,我有点搞蒙了。。。
public class test{
public static void main(String args[]){
float a=1000000000000f;
float b=-1000000000000f;
float c=a+1+b;
float d=a+b+1;
System.out.println(c);
System.out.println(d);

}
}
出来之后c结果为0.0 ;
d结果为1.0;
这是为什么?
我不太明白是怎么回事,我对单精度双精度这块知识比较模糊,看了很久没没怎么看明白,望各位帮忙。

------解决方案--------------------
a+1=1.000000000001e12;
float类型4个字节,32位,其中24位表示位数和数值符号,8位表示指数和指数符号,所以位数表示的范围是2^23-1,无法表示“1.000000000001”,所以a+1的结果被近似为1.0e12,在+b就为0.0了,而第二个是a+b=0.0,再+1就为1.0(float类型)了。

float f = (a+1);
System.out.println(f);这两句话我试验了下,结果为1.0E12。
------解决方案--------------------
float的有效小数位数为8为,你用a+1的时候的到的结果,小数位数超过了8位,1被舍弃了,所以a+1+b=0.0,
a+b=0,然后再+1,1就不是8位小数以后的位数了,所以就是1.0了