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

目录
相关文章
|
30天前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
52 4
|
1月前
|
存储 缓存 Java
【深入浅出】揭秘Java内存模型(JMM):并发编程的基石
本文深入解析Java内存模型(JMM),揭示synchronized与volatile的底层原理,剖析主内存与工作内存、可见性、有序性等核心概念,助你理解并发编程三大难题及Happens-Before、内存屏障等解决方案,掌握多线程编程基石。
|
2月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
232 3
|
2月前
|
缓存 监控 Kubernetes
Java虚拟机内存溢出(Java Heap Space)问题处理方案
综上所述, 解决Java Heap Space溢出需从多角度综合施策; 包括但不限于配置调整、代码审查与优化以及系统设计层面改进; 同样也不能忽视运行期监控与预警设置之重要性; 及早发现潜在风险点并采取相应补救手段至关重要.
473 17
|
3月前
|
存储 监控 算法
Java垃圾回收机制(GC)与内存模型
本文主要讲述JVM的内存模型和基本调优机制。
|
3月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
3月前
|
边缘计算 算法 Java
Java 绿色计算与性能优化:从内存管理到能耗降低的全方位优化策略与实践技巧
本文探讨了Java绿色计算与性能优化的技术方案和应用实例。文章从JVM调优(包括垃圾回收器选择、内存管理和并发优化)、代码优化(数据结构选择、对象创建和I/O操作优化)等方面提出优化策略,并结合电商平台、社交平台和智能工厂的实际案例,展示了通过Java新特性提升性能、降低能耗的显著效果。最终指出,综合运用这些优化方法不仅能提高系统性能,还能实现绿色计算目标,为企业节省成本并符合环保要求。
135 0
|
存储 SQL Java
JAVA中对存储过程的调用方法(引)
一:Java如何实现对存储过程的调用:   A:不带输出参数的   ---------------不带输出参数的----------------------------------create procedure getsum@n int =0asdeclare @sum intdeclare @i...
791 0
|
存储 Java 数据库连接
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
120 1