实型 和整型是如何储存的,
int和float 、long和double的存储位数是一样的 为什么取值范围不同?

解决方案 »

  1.   

    int long 是有符号的,float和double是无符号的,但是他们得照顾小数位数,而INT LONG只需要拿出一位负责正负,不需要管小数。当然取值范围没有可比性了,我是这么理解的。不一定正确。呵呵
    int -2(31)----2(31)-1
    long -2(63)-----2(63)-1
    float 32位标准IEEE754 精度是6-7位
    double 64位标准IEEE754 精度是14-15位
      

  2.   

    int ,long 这种整数类型的除一个符号位以外,用其余位数以二进制表示其值,故:
    //32位机
    int -2(31)----2(31)-1 ,约2E9  //四字节,正数大值-1是因为有一个0,具体的自己再查资料吧
    long -2(63)-----2(63)-1,约9E18 //八字节float和double 分两部分:底数(也称尾数)和阶(一般底数有个符号位,阶用移码表示)
    假设用一个4字节数表示一个浮点数,可以32字节取7位作价码,一个底数符号位,剩余24位作底数值,则它的范围是:0.111111111111111111111111(24个1)的2的6次方(以111111为移码也可粗略看成是有一个符号位)到+0.111111111111111111111111(24个1)
    转换成十进制大约是:正负1.8E19
    它的精度爱底数位数限制,大约能表示17000000以下的数,明显位数小于int32,所以大整数转成float时会有精度丢失.IEEE754浮点数标准: 
    单精度数(四字节) 符号位1位,阶码8位,尾数23位 
    双精度数(八字节) 符号位1位,阶码11位,尾数52位 
    转化成十进制大约是:
    单精度数:-3.4E38~3.4E38 ,有效位7位
    双精度数:-1.7E308~1.7E308 ,有效位16位
    注意这有有效位不是满9的,所以9876543转成float还是会有精度丢失的(具体可通过2的23次,52次方计算其约值)
      

  3.   


    最后那个结论在JAVA中我也没有验证过,我刚才在JDK1.4中试了下居然没有丢失精度,汗!
    但:
    987654321会变成:
    9.8765434E8不太了解JVM里的东西
    大概就是这样了我想,知道这么回事就可以了.一般不会这么巧需要用到这么边缘的数据吧
    一般般的用float就可以了,再大又需要精度的用 double 
    再大就得用java.math.BigDecimal了
      

  4.   

    malligator(不能再整天泡在CSDN里了!) ( ) 信誉:100    Blog  2006-12-03 16:03:32  得分: 0   
       晕
    最后那个结论在JAVA中我也没有验证过,我刚才在JDK1.4中试了下居然没有丢失精度,汗!======
    因为我是紧挨着打印来测试的,有可能JVM做了优化了,不了解~
    但从987654321那个数还是可以大概看出它的精度限制的