Java浮点数存储格式

浮点数的陷阱:你以为的 0.1 + 0.2其实不是 0.3,BigDecimal你真的用对了吗? 在金融和交易系统中,哪怕是一分钱的误差都可能造成巨大损失。然而,很多开发者仍在不经意间落入浮点数的陷阱:看似简单的 0.1 + 0.2,为什么在 Java 中不等于 0.3?本篇文章从底层的 IEEE 754 浮点数标准讲起,剖析误差来源,逐层构建 BigDecimal 使用、格式化控制、精度舍入、判等策略等防线,并结合真实案例总结出一套浮点数处理的实战规范,助你规避金额计算中的隐性风险。 阅读详情
JAVA中浮点数有两个基础类型:float和double。float占据4个字节,double占
据8个字节。下面将以float类型为例,介绍浮点数的存储方式。double类型和
float类型的存储方式雷同。
 
1.浮点数的存储方式
 
浮点数的存储格式比较特殊,下图是4字节的float变量的存储示意图:
 
根据IEEE754浮点数表示标准,一个float变量在存储中由三部分组成,分别是:
符号位:1位(31),表示float的正负,0为正,1为负
幂指数:8位(23-30),表示2进制权的幂次
有效位:23位(0-22),表示有效数字
 
2.浮点数的取值范围

在float的存储中,有4个特殊的存储值,分别是:
0x7f800000:正无穷大,Float.intBitsToFloat()打印显示为infinity
0xff800000:负无穷大,打印显示为-infinity
0x00000000:正零,打印显示为0.0
0x80000000:负零,打印显示为-0.0
注意,在Java中,infinity!=-infinity,但是0.0==-0.0

以上4个特殊存储值将float的存储分为4个段
[0x00000001,0x7f7fffff]:正float数,共2^31-2^23-1个
[0x7f800001,0x7fffffff]:非数字,打印显示NaN,共2^23-1
[0x80000001,0xff7fffff]:负float数,共2^31-2^23-1个
[0xff800001,0xffffffff]:非数字,打印显示NaN,共2^23-1

3.浮点数的格式转换

令bits表示一个整数,其存储空间为4字节,下面我们求出这4个字节表示的float
类型数字为多少。

int s = ((bits>>31) == 0)?1:-1;  //取出1bit符号位
int e = ((bits>>23) & 0xff); //取出8bit的幂指数
//取出23位有效位
int m = (e==0)?((bits & 0x7fffff) << 1):
               ((bits & 0x7fffff) | 0x800000);
则该存储空间表示的浮点数为 s*m*2^(e-150)

分析:
[0x00000001,0x007fffff]:相应实数范围为[(2^-149),(2^-126)-(2^-149)],即
大约为[1.4E-45,1.2E-38],离散间隔固定为(2^-149)即约为1.4E-45,
实数个数为2^23个。
[0x00800000,0x7f7fffff]:相应实数范围为[(2^-126),(2^128 - 2^104)],即大约为
[1.2E-38,3.4E38],以后每增加2^23个实数,离散间隔增大一倍。

所以,浮点数设计完成了整个A=[0x00000000,0x7f7fffff]离散空间
到B=[0.0,3.4E38]区间
部分值的一个映射,该映射具有以下属性:
<1>B中被映射实数的初始间隔为c=2^-149,并且每经过2^23个数间隔变为c=2*c
<2>该映射是单调递增的

评价:
浮点数的存储设计,从本质上来说是设计了一个优秀的数值映射,充分利用了2进制存储
的特点。

 
别再到处找教程了!Windows下用FFmpeg+Mediamtx+VLC搭建本地RTSP流媒体服务器,保姆级配置流程 本文详细介绍了在Windows系统下使用FFmpeg、Mediamtx和VLC搭建本地RTSP流媒体服务器的完整流程。从环境准备到核心配置,再到推流和拉流的实战技巧,提供了保姆级的避坑指南和优化建议,帮助开发者快速实现稳定的流媒体服务部署。 阅读详情

相关推荐

从Maya到Unity:3D模型导入全流程避坑指南(含FBX导出设置)

本文详细解析了从Maya导出3D模型至Unity的全流程,重点剖析了FBX格式作为跨软件协作“中间人”的优劣与核心设置。指南涵盖了Maya端模型清理、FBX导出关键配置(如嵌入媒体、轴转换),以及Unity端的模型、材质、动画导入优化与常见问题(如材质丢失、UV法线错误、骨骼动画错乱)的实战解决方案,旨在帮助3D美术师与技术美术建立稳定、高效的工作流。

lg888的博客 791

java float存储方式_JAVA中浮点型数据的存储方式

前言在JAVA中,我们知道int和float占用4个字节,double和long占用8个字节。那为何int和long的取值范围分别是[-2^31,2^31],float的取值范围却是[-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.40129846432481707e-45 ~ 3.40282346638528860e+38]?(...

weixin_36311421的博客 1231

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

java浮点数存储方式_一文帮你读懂Java浮点数的存储原理

前言Java数值分整数和浮点数,前一篇文章已经解析了Java整数的存储原理,本篇将接着解析浮点数在计算机里的存储原理。Java浮点数分单精度类型( float)和双精度类型(double),float 数据占用 32bit,double 数据占用 64bit。Java浮点数标准java中浮点数采用的IEEE754标准,该标准的全称为IEEE二进制浮点数算术标准。这个标准规定的存储格式是这样的:符号...

weixin_42356307的博客 1039

从入门到精通:激光器恒流驱动电路的设计与选型指南

本文深入解析了激光器恒流驱动电路的设计与选型。文章从基础电路原理讲起,对比了简易恒流源与高精度运放反馈方案的优劣,并重点阐述了如何为不同功率与精度要求的激光器项目选择合适的恒流驱动方案,强调了恒流源对于保障激光器稳定工作、防止热失控及延长寿命的核心作用。

grafana6viz的博客 711

MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

上一博文【MIKE水动力笔记6】主要讲解如何自己制作实测数据的时间序列文件dfs0,而本博文讲解如何进行实测数据与模型输出结果的拟合对比。

晏长街的博客 1万+

java八种基本类型以及float是怎么存储的

java八种基本类型和float存储方式

蹲茅坑逗蛆蛆 1032

【2026年华为秋招(AI)-2月4日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要:本文包含20道选择题,涵盖机器学习、线性代数、Transformer架构、概率统计等多个领域。题目涉及正交矩阵性质、Transformer注意力机制、聚类距离度量、ReAct框架、Softmax函数、混淆矩阵计算、Flash-Attention优化、位置编码、期望计算、归一化方法、矩阵迭代法、矩阵秩、大模型架构、神经网络推理、泊松流性质、SVM核函数以及聚类算法等知识点。每道题均提供解析,帮助理解核心概念和解题思路。

m0_73659489的博客 125

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

由于使用IEEE 754标准进行存储,float和double类型可以表示非常大或非常小的浮点数,并且具有一定的精度。然而,由于浮点数的特性,它们在进行精确计算时可能会存在舍入误差。在编写Java程序时,需要注意使用适当的数据类型和进行浮点数比较时的误差处理,以避免潜在的问题。在Java语言中,float和double是用于表示浮点数的数据类型。

高性价比服务器就选:蓝易云 1274

一文读懂 SAP BTP Application Router 的 Resource Files:从 xs-app.json 到本地开发的默认设置

本文详解SAP BTP中Application Router的资源文件配置与本地开发实践。核心包括:xs-app.json定义路由规则与安全策略,package.json声明依赖与启动脚本,resources/存放静态资源,default-services.json和local-destinations.json用于本地模拟云服务。文章通过真实案例展示如何配置静态资源直出、反向代理后端服务,并强调本地开发时的注意事项与常见问题解决路径。关键配置均提供示例代码,帮助开发者快速实现业务应用的部署与联调。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2286

JAVA数据类型——浮点数存储格式

Java浮点数存储格式   JAVA中浮点数有两个基础类型:float和double。float占据4个字节,double占 据8个字节。下面将以float类型为例,介绍浮点数的存储方式。double类型和 float类型的存储方式雷同。   1.浮点数的存储方式   浮点数的存储格式比较特殊,下图是4字节的float变量的存储示意图:   根据IEEE754浮点数表示

zdl543的专栏 8598

PID控制算法实践应用(一):PID算法的离散化

由于计算机控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量。因此,连续PID控制算法不能直接使用,需要采用离散化方法。

m0_72676510的博客 2602

Java中浮点数的存储格式

  当一个同事问我:Java中的double的取值范围是多少时,我一脸的茫然,除了知道浮点数由符号位、指数位和小数位组成之外,其它的一无所知。大学里《计算机组成》中学的东西也忘得一干二净。  查了一些资料,并亲手写了些测试代码,总算弄明白了,在此做个笔记。 1.三种存储格式  Java遵循的是IEEE 754 规范。在这个规范里,提到了浮点数的三种类型:单精度、双精度和双精度扩展。  

星光灿烂 2552

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java深入学习一之整数与浮点数存储格式

一、 java语言规范1.标识符 标识符可以作为类名,变量名,方法名等,但不能使用关键字,布尔值和Null等,标识符以字母开头,由数字或字母构成的字符串。在这里字母是unicode字符,可以使用中文作为标识符。 public static void main(String[] args) { 打印(); } public static void

十十办文武的博客 560

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java ieee754_深入理解计算机内部浮点数的IEEE754格式存储

2.双精度(长浮点数)的验证过程:在VC++6.0中输入Data type .c的内容如下:#include"stdio.h"void main(){short int a[]={15,-15};//short 占据的内存大小是2 个byte;int b[]={15,-15};//int占据的内存大小是4 个byte;long int c[2]={15,-15};//long占据的内存大小是4 ...

weixin_35851508的博客 298

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java浮点数的存储结构_java浮点数存储

转自:1、小数的二进制表示问题首先我们要搞清楚下面两个问题:(1) 十进制整数如何转化为二进制数,其实就是采用的科学计数法算法很简单。举个例子,11表示成二进制数:11/2=5 余 15/2=2 余 12/2=1 余 01/2=0 余 10 结束所以:11二进制表示为(从下往上):1011 = 1*(2的3次方)+0*2的2次方+1*(2的1次方)+1*(...

weixin_39986027的博客 358

瑞_Java中浮点数精度误差产生原因_浮点数底层存储结构(详细附代码)

0.1f + 0.2f == 0.3f竟是true?0.1 + 0.2 == 0.3却是false!?本文对Java(JDK1.8)中浮点数底层的存储结构进行探索。本文主要结合《码出高效》中浮点数的原文,以float类型的底层存储结构说明浮点数精度引发的问题。文中浮点数解析代码主要以 16.35f和0.35f中小数部分的存储值不同为例。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 4564

计算机基础-浮点数的表示

利用Java的大数展示浮点数之谜 引用知乎:https://zhuanlan.zhihu.com/p/89320102 1.浮点数的存储格式 浮点数的精度问题并不只是存在于某个语言之上,而是在整个计算机体系上来说都存在这样的问题 现在几乎所有语言都支持 IEEE 754 的二进制浮点格式。在说明这个格式之前,先看看科学计数法,有一个这样的数:123.456,表示成科学计数法是:+ 1...

P19777的博客 2031

java float存储方式与计算_为什么在处理金额时不能用Double和Float,计算机是如何存储浮点数的...

浮点数的存储模式前言1. 十进制和二进制的转换1.1 十进制转二进制1.2 二进制转十进制2. 科学计数法3. 浮点数格式3.1 为什么不能用浮点数存储金额4. 移码4.1 机器中所使用的偏移量4.2 为什么要使用移码4.3 为什么不是2^n-1^参考材料前言码出高效这本书以前翻到浮点数这一页的时候随便看一下过了就过了,最近再次开始翻,才发现浮点数这个东西其实并没有想象中这么简单,于是写一篇文章记...

weixin_42315996的博客 522

16进制浮点数

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。  计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa也叫有效数字 ),一个基数(Base),一个指数(Exponent)以及  一个表示正负的符号来表达实数。浮点数利用指数达到了浮动小数点的效果,从而可以

yqj234的专栏 5780

java double 存储_Java语言中:float、double在内存中存储方式

java语言中,float类型数字在计算机中用4个字节(32位)来存储。double类型占用8个字节(64位)。 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。按照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法:用符号、指数和尾数来表示。指数可正可负...

weixin_35954566的博客 784
上一篇: STL之stack&queue容器
下一篇: [算法之回溯法] 子集树与排列树
strollerV
博客等级 码龄20年 13粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值