- 转换原则(低精度向高精度转换):byte->(short,char)->int->long->float->double
IEEE754浮点数标准
- IEEE754标准包含一组实数的二进制表示法。它有三部分组成:符号位, 指数位, 尾数位
- 三种精度的浮点数各个部分位数如下:
精度 | 符号 | 阶/指数 | 尾数 |
---|---|---|---|
单精度 | 1 | 8 | 23 |
- 第一部分用来存储符号位(sign),用来区分正负数,0正1负。
- 第二部分用来存储指数(exponent),指数也有正负之分,指数位确定大小范围。
- 第三部分用来存储小数(fraction),小数位决定了计算精度,因为小数位能表示的数越大,精度越大,数值越准确。
指数位确定范围
- 指数可能是负数,也有可能是正数。而有符号整数的计算是比无符号整数麻烦的。所以为了减少不必要的麻烦,在实际存储指数的时候,需要把指数转换成无符号整数。
- 我们看到float的指数部分是8位,则指数的取值范围是 -126到+127,为了消除负数带来的实际计算上的影响(比如比较大小,加减法等),可以在实际存储的时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量为127。
小数位确定精度
- float和double的精度是由尾数的位数来决定的。
- float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数,但绝对能保证的为7位,也即float的精度为7~8位有效数字(算上整数的一位)
- double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位
总结
- long:2^63-1;
- float : float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38
- 所以:float的数据范围大于long的数据范围