float和long的数据范围问题

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是浮点型,不精确的。

你可能感兴趣的:(java)