float:四个字节。long四个字节,但是float的存储范围比long的存储范围要大。
但是在我阅读《java核心卷一》的时候,long转float时会有精度损失问题,即long转float是有可能丢失末尾的几位有效数字。
java的精度问题有两个类可以解决:BigInteger(大整型)和BigDecimal(大浮点型)
https://mp.csdn.net/postedit/100125465
为什么float的4个字节比long类型的8个字节的范围大
因为整数与小数的底层存储有点不同。
相同点:它们都是用二进制存储的
不同点:
小数先转成二进制,然后处理,然后存储。
例如:8.25
(1)小数先转成二进制
十进制:8.25
二进制:1000.01
(2)处理
二进制:1000.01 处理成科学记数法
1.00001 * x的3次
0.00125 ->0.0000 0000 ....==》 处理成科学记数法 1.xxx * 某的-n次
规律:科学计数法处理后
A:整数部分一定是1
B:指数部分是一个整数
C:小数点后面是一串数字
(2)如何存储
A:整数部分一定是1 不存
B:指数部分是一个整数 要存储 float类型分配8位专门用来存储指数,double分配了11位
C:小数点后面是一串数字 要存储 float剩下的23位用来存储尾数,double剩下的52位存尾数
D:正号和负号 最高位是0是正,1是负
存储方式不同
(1)我们float和double是存储2的幂次方,所以数据范围比long要大。
(2)float用23位存尾数,double用52位存尾数,精度范围double比float大。
float的精度大概是小数点后6~7位,double是15~16
(3)十进制的小数转为二进制时,尾数可能是无限长,那么我们尾数位又是只有23或52位,
意味着超出部分会被截掉,这样就是我们float和double是浮点型,不精确的。