javaSE.浮点类型
- float 单精度浮点型(32bit,4字节)
- double 双精度浮点型(64bit,8字节)
小数在计算机如何存储呢?
float 单精度实数的存储结构:
S(31) E(阶码,30~23,共8位) M(尾数,22~0,共23位)
double 双精度的存储结构:
S(63) E(阶码,52~62,共11位) M(尾数,51~0,共52位)
根据国际标准IEE 754,任意一个二进制浮点数V可以表示成下面的形式:
V = (-1)^S * M * 2^E
①(-1)^S表示符号位,当S = 0,V为整数,当S = 1,V为负数;
②M表示有效数字,大于等于1,小于2,但整数部分的1不变,因此可以省略。(例如尾数为1111010,那么实际上就是1.111010,尾数的首位必须是1,1后面紧跟小数点,如果出现0,001111这样的情况,去掉前面的0,移动1到首位,随着时间的发展,IEEE754标准默认第一位为1,故为了能够存放更多数据,就舍去了第一位,比如保存1.0101的时候,只保存0101,这样能够多存储一位数据)
③2^E表示指数位。(用于移动小数点,所以说才称为浮点型)
比如,对于十进制的5.25对应的二进制为:101.01,相当于:1.0101*2^2。
所以S为0,M为1.0101,E为2.
因此,对于浮点类型,最大值和最小值,不仅取决于符号和尾数,还有它的阶码,
大致范围:
- 单精度:+or- 3.40282347*10^38
- 双精度:+or- 1.79769313486231570*10^308
精度缺失
public class Main {
public static void main(String[] args) {
float f = 9.9F;
double a = f; // 隐式类型转换,float转double
System.out.println(f); //9.9
//精度缺失
System.out.println(a); //9.899999618530273
}
}
精确计算会用到:BigDecimal和BigInteger,其中BigDecimal更适合需要精确计算的场景。
long 竟然可以丢给float 进行隐式类型转换
float 只有32bit,long有64bit。由于浮点类型,指数可以变化,最大数值范围是大于long的,虽然精度会缺失,但可以表示这么大的数。
public class Main {
public static void main(String[] args) {
long l = 5234523454235432534L;
float f = l;
System.out.println(f); //5.2345236E18
}
}
隐式类型转换规则:
byte->short(char)->int->long->float->double