Java语言之float、double内存存储方式

简介: Java语言之float、double内存存储方式

前言

      本文讲述float、double的浮点型内存存储方式,浮点型存储和整形存储方式不同,所以字节大小或许一样,但是内容含义不一样。而float和double都涉及到精度问题,那么我们先来说说什么是精度!

精度:用科学记数法表示后,小数点能保留几位有效数字。

例如:11234.2234化成科学记数法,为1.12342234。小数点后有8位,则该精度为8位

浮点型(float和double)在内存中使用科学计数法存储,即一个浮点数有2部分组成:底数m和指数e,而指数e前面还有一位bit位是符号位,即代表了正负。

对了,本文还需要会计算小数的二进制哦

一.Float

       Float是单精度浮点类型,在计算机当中采用4个字节存储(采用IEEE754标准:标准规定了计算机程序设计环境中的二进和十进制的浮点数自述的交换、算术格式以及方法),虽然是四个字节,但实际上并不是32位比特位全用于存储。

如上图,float虽然占有了4个字节,32位bit位,但内存实际被分成了三部分,首位bit代表了符号位,之后8位代表了指数位,最后23位代表了底数位。


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


 指数位: 8位,表示指数,可表示数据范围(00000000-11111111,对应的十进制为0-255)


 因为指数可以是正数也可以是负数,IEEE754标准规定:指数减去127才是实际的指数(这是规定)


 float的指数表示范围是-127到128;


 底数位:只存储23位,最大值为2^23=8388607(7位数),由于我们输入的是十进制,因此对应十进制数为7位,故该float型的精度为7~8位有效数字(有的编译器为7位,有的为8位)


float精度的展示:

例如:23.625

23的二进制为10111

0.625的二进制 :0.625*2=1.25取整1,小数部分为0.25  

                           0.25*2=0.5取整为0,小数部分为0.5

                           0.5*2=1取整为1,小数部分为0.     //停止取整0.625二进制值:0.101

因此,23.625的二进制:10111.101

10111.101用科学记数法:1.0111101*2^4       //类比十进制数123.5—>1.235*10^2

指数:4,但是实际指数需要加127,为131,转换为二进制为:10000011

该数字为正数,所以符号位为0

内存存储形式:0  10000011 01111010000000000000000

   //符号位  +  指数二进制  +   科学记数法的小数部分   +  其余位为0

注:指数加127的原因是,计算机是为了更好的计算,当需要展示时会自动减去127的。

二.double

double是双精度浮点类型,在计算机中拥有8个字节,也就是64位bit位。

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

  指数位: 11位,表示指数,可表示数据范围(00000000000-11111111111,对应的十进制为0-2047)

 因为指数可以是正数也可以是负数,IEEE754标准规定:数减去1023才是实际的指数(这是规定)

  double的指数表示范围是-1023到1024;

  底数位:只存储52位,最大值为2^52=4503599627370496(16位数),由于我们输入的是十进制,因此对应十进制数为16位,故该double型的精度为16~17位有效数字(有的编译器为16位,有的为17位)

例如:23.625
23的二进制为10111

0.625的二进制 :0.625*2=1.25取整1,小数部分为0.25  

                           0.25*2=0.5取整为0,小数部分为0.5

                           0.5*2=1取整为1,小数部分为0.     //停止取整,0.625二进制值:0.101

因此,23.625的二进制:10111.101

10111.101用科学记数法:1.0111101*2^4       //类比十进制数123.5—>1.235*10^2

指数:4,但是实际指数需要加1023,为1027,转换为二进制为:10000000011

该数字为正数,所以符号位为0

内存存储形式:0 10000000011 0111101000000000000000000000000000000000000000  

            //符号位  +  指数二进制  +   科学记数法的小数部分   +  其余位为0

注:指数加1024的原因是,计算机是为了更好的计算,当需要展示时会自动减去1024的。

三.float和double对比

(1)在内存中占有的字节数不同

  • 单精度浮点数在机内占4个字节
  • 双精度浮点数在机内占8个字节

(2)有效数字位数不同

  • 单精度浮点数有效数字7/8位
  • 双精度浮点数有效数字16/17位

(3)所能表示数的范围不同

  • 单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
  • 双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308

(4)在程序中处理速度不同

       一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快。

目录
相关文章
|
1月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
107 14
|
4天前
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
5天前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
6天前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
20天前
|
存储 固态存储 芯片
计算机中内存与存储
【7月更文挑战第28天】
26 1
|
22天前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
34 3
|
1天前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
25天前
|
存储 弹性计算 程序员
新手程序员如何阿里云服务器配置?新人开发者CPU内存带宽存储怎么选?
对于新手开发者、个人或学生选择阿里云服务器,推荐ECS经济型e实例(ecs.e-c1m1.large),适用于小型网站或轻量应用。配置2核2G内存、3M固定带宽、40G ESSD系统盘,仅99元/年且续费同价。
|
7天前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
|
1月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。