java基础浮点类型

目录

1:float类型和double类型的定义

2:二者的范围和精度

3:float类型详解

3.1:整数位10进制转换为2进制

3.2:小数位10进制转换为2进制

3.3:把二进制放到浮点类型中

3.4:精度损失

4:double类型详解


1:float类型和double类型的定义

我们在现实生活中经常用到10进制的数据,比如整数和小数。但是小数经常出现小数点后无限循环的情况。比如圆周率的π和1/3。这些数字想要存入计算机中。我们只能使用double和float来存储。但是计算机的内存不是无限的。我们不可能真正的存储下这些数字。

float:单精度,占用4个字节的内存空间,也就是4*8=32位二进制。

double:双精度,占用8个字节的内存空间,也就是8*8=64位的二进制。

2:二者的范围和精度

java基础浮点类型_第1张图片

3:float类型详解

在我们了解float和double类型之前,我们首先要知道10进制转换2进制的方法。

假如现在有一个10进制的数字是3.625

3.1:整数位10进制转换为2进制

我们首先把10进制的3转换为二进制,转换过程如下(除2取余)

整数位计算:除2 取余
3/2=1 1
1/2=0 1

所以10进制的3转换为二进制就是从下往上:11

3.2:小数位10进制转换为2进制

我们首先把10进制的0.625转换为二进制,转换过程如下(乘以2,大于1取1,小于1取0)

小数位计算:乘以2 取整数位(从上往下)
0.625*2=1.25 1
0.25*2=0.5 0
0.5*2=1 1

所以10进制的0.625转为二进制就是从上往下:101

那么得出结论10进制的3.625转换为二进制就是11.101

我们从验证工具得知

java基础浮点类型_第2张图片

3.3:把二进制放到浮点类型中

java基础浮点类型_第3张图片

从上边我们知道 3.625(10进制)=11.101(二进制)

在10进制下:  14.25=1.425*10^1

在二进制下:   11.101=1.1101*2^1

符号位:0代表正数,1代表负数

指数位:存储指数

底数位:存储底数

3.625(10进制)=11.101(二进制)=1.1101*2^1(二进制)

那么分析3.625的二进制

符号位:0

指数位:用8位来存储指数,范围是0-255(10进制),0-126代表负数,127代表0,128-255代表正数,再结合余127码,他应该存储1+127(10进制)即1000 0000(二进制)。

底数位:我们用23位来存储底数,1110 1000 0000 0000 0000 000(二进制),考虑到每个数转换为科学计数法之后每个数第一位必是1,所以我们从第二位开始存储,1101 0000 0000 0000 0000 000。

索引最终的结果就是

0 1000 0000 1101 0000 0000 0000 0000 000

自我测试

我们以1.0F-0.42F来举例子说明浮点数的运算规则

1.0F(单精度)=1(二进制)=1*2^0(二进制)

指数位是0:在8位二进制的是指数位,0+127代表0,127(10进制)=1111111(二进制)

0 0111 1111 0000 0000 0000 0000 0000 000

0.42F(单精度)=0.0110101110000101000111101=1.10101110000101000111101*2^-2

指数位是-2:在8位二进制的是指数位,127代表0,127-2=125代表-2

125(10进制)=0111 1101(二进制)

0 0111 1101 1010 1110 0001 0100 0111 101

3.4:精度损失

精度由尾数位数决定。
float:2^23 = 8388608 
double:2^52 = 4503599627370496
由此可见,float尾数为7位,double尾数为16位。因此,float的精度为6到7位有效数字,
double的精度为15到16位有效数字。

1.1(进制)=1.0001100110011001100110011001100110011001100110011001101*2^0(二进制)

在浮点类型中尾数部分分别能存储23位和51位,势必要截取掉多余的位数,就会导致精度损失。在运算的时候难以得到我们需要值。

java基础浮点类型_第4张图片

    

4:double类型详解

跟float大同小异,理解float就能理解double。

你可能感兴趣的:(Java基础,java)