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:二者的范围和精度

在这里插入图片描述

3:float类型详解

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

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

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

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

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

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

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

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

小数位计算:乘以2取整数位(从上往下)
0.625*2=1.251
0.25*2=0.50
0.5*2=11

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

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

我们从验证工具得知

3.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的二进制标准格式是11.101

0.625的二进制标准格式是0.101=1.01*2^-1

为什么不是使用标准格式来作为存储格式?
设想一下,假如是使用标准格式来作为存储格式,是不是需要规范前几位为整数位,后几位为小数位。比如前8位作为整数位,那如果现在的数据内容整数位为0,如0.625……的话,就浪费了前八位的空间,这个浪费是以牺牲小数精度为代价。所以才有了存储格式这么个东西。

符号位最简单,表示正负。

在介绍指数位之前,先了解尾数位:

尾数位实际上是还有一个隐藏位为1在尾数位的左侧。

如3.625的二进制格式:11.101 = 1.1101\times 2^{1}(1即是指数位)

(如果不能理解的话,可以将二进制转为10进制来理解:

那么分析3.625的二进制

符号位:0

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

底数位:我们用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进制)=0111 1111(二进制)

0 0111 1111 0000 0000 0000 0000 0000 000

0.42F(单精度)=0. 0110 1011 1000 0101 0001 1110 1=1.1010 1110 0001 0100 0111 101*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(10进制)=1.0001100110011001100110011001100110011001100110011001101*2^0(二进制)

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

    

4:double类型详解

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

float、double精度范围
float、double的精度与范围:
float的范围为-2^128 ~ +2^128(-3.40e+38 ~ +3.40e+38)
有效位数:7


double的范围为-2^1024 ~ +2^1024(-1.79e+308 ~ +1.79e+308)
有效位数:16

float: 尾数+数符 24位 阶码+阶符8位
double : 尾数+数符53位 阶码+阶符11位

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值