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;
这是为什么?
我不太明白是怎么回事,我对单精度双精度这块知识比较模糊,看了很久没没怎么看明白,望各位帮忙。

解决方案 »

  1.   

        float 它是32位的,它的有效范围比int的取值范围还小,int最大取值是2^32-1约等于21亿,float 32位有8位是符号位 有效范围2^23-1,所以的的数字大大超过了float范围。换成double就可以精确到。
      

  2.   

           就是不太明白float范围是多少?  我查了一下float最大值可以到 3.402823E38 ,怎么也想不明白1e12居然会溢出?   
      

  3.   

    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。
      

  4.   

    float的有效小数位数为8为,你用a+1的时候的到的结果,小数位数超过了8位,1被舍弃了,所以a+1+b=0.0,
    a+b=0,然后再+1,1就不是8位小数以后的位数了,所以就是1.0了