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

目录
相关文章
|
17天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
25天前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
38 3
|
1月前
|
Java 编译器 测试技术
go语言避免不必要的内存分配
【10月更文挑战第18天】
47 1
|
1月前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
28 2
|
4月前
|
Java
【Java基础面试十】、何对Integer和Double类型判断相等?
这篇文章讨论了如何在Java中正确比较`Integer`和`Double`类型的值,指出不能直接使用`==`操作符比较不同类型,而应该将它们转换为相同的基本数据类型(如`double`)后进行比较。
【Java基础面试十】、何对Integer和Double类型判断相等?
|
4月前
|
Rust 安全 程序员
揭秘Rust语言的内存安全秘籍:如何构建坚不可摧的系统级应用?
【8月更文挑战第31天】Rust语言凭借其独特内存安全机制在编程领域脱颖而出,通过所有权、借用与生命周期等概念,在保证高性能的同时避免了缓冲区溢出等常见错误。本文深入探讨Rust的内存安全机制,并通过示例代码展示如何利用这些机制构建高效且可靠的系统。尽管这些机制增加了学习难度,但为软件开发奠定了坚实基础,使Rust成为系统、嵌入式及网络编程的理想选择。随着社区的发展,Rust将在未来软件开发中扮演更重要角色。
97 0
|
5月前
|
Java
Java中将保留四位小数的Double转换为String的方法详解
选择合适的方法,可以使代码更加简洁、高效,同时也能满足不同场景下的需求。
85 5
|
6月前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
77 3
|
5月前
|
存储 SQL 数据库
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
|
6月前
|
Rust 安全 开发者
探索Rust语言的内存安全特性
【6月更文挑战第8天】Rust语言针对内存安全问题提供了创新解决方案,包括所有权系统、借用规则和生命周期参数。所有权系统确保值与其所有者绑定,防止内存泄漏;借用规则保证同一时间只有一个可变引用或多个不可变引用,消除数据竞争和野指针;生命周期参数则强化了引用的有效范围,提升安全性。通过这些特性,Rust帮助开发者编写出更健壮、安全的高性能软件,有望成为系统编程领域的领头羊。