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位
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次方计算其约值)
int -2(31)----2(31)-1
long -2(63)-----2(63)-1
float 32位标准IEEE754 精度是6-7位
double 64位标准IEEE754 精度是14-15位
//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次方计算其约值)
最后那个结论在JAVA中我也没有验证过,我刚才在JDK1.4中试了下居然没有丢失精度,汗!
但:
987654321会变成:
9.8765434E8不太了解JVM里的东西
大概就是这样了我想,知道这么回事就可以了.一般不会这么巧需要用到这么边缘的数据吧
一般般的用float就可以了,再大又需要精度的用 double
再大就得用java.math.BigDecimal了
晕
最后那个结论在JAVA中我也没有验证过,我刚才在JDK1.4中试了下居然没有丢失精度,汗!======
因为我是紧挨着打印来测试的,有可能JVM做了优化了,不了解~
但从987654321那个数还是可以大概看出它的精度限制的