C语⾔long和float哪个范围⼤,float和long的数据范围问题float:四个字节。long四个字节,但是float的存储范围⽐long的存储范围要⼤。
但是在我阅读《java核⼼卷⼀》的时候,long转float时会有精度损失问题,即long转float是有可能丢失末尾的⼏位有效数字。
java的精度问题有两个类可以解决:BigInteger(⼤整型)和BigDecimal(⼤浮点型)
为什么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位
浮点型变量floatC:⼩数点后⾯是⼀串数字  要存储  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是浮点型,不精确的。