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处理单精度浮点数的速度比处理双精度浮点数快。

目录
相关文章
|
3月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
782 0
|
3月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
221 1
|
3月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
218 0
|
9月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
276 7
|
10月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
187 1
|
11月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
120 3
|
11月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
809 2
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
822 0
|
12月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。