百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

JAVA中的浮点数与二进制(java中浮点数的定义)

yuyutoo 2025-06-10 03:00 1 浏览 0 评论


先来看一段简单的代码

public static void main(String[] args) {    
    System.out.println(0.1+0.2);
}

打印结果如下:

0.30000000000000004  //为什么0.1+0.2不等于0.3?

为什么会出现这种诡异的答案呢?

这还得从浮点数的二进制表示方法说起

这年头儿,连过马路的老奶奶估计都知道,计算机是采用二进制计数的



来,简单的考你一下:请把数字15写成二进制的形式

//答案应该比较简单0000 1111

相信你对整数的二进制已经比较熟悉


但如果我换成小数呢?3.14159265359该怎么表示?

其实,如果不搞底层设计,一般人还真的不太知道这个答案

但你只有理解小数在二进制中是如何表示的

才能够明白文章开头的案例【为什么0.1+0.2不等于0.3?】



我们以小数0.1为例,看看它是如何使用二进制存储的

第一步,把0.1 乘以 2, 得到的结果0.2,  整数部分 0 取走
第二步,把上一步留下的小数部分0.2,乘以2,得到的结果0.4,  整数部分 0 取走
第三步,把上一步留下的小数部分0.4,乘以2,得到的结果0.8,  整数部分 0 取走
第四步,把上一步留下的小数部分0.8,乘以2,得到的结果1.6,  整数部分 1 取走......直到,小数部分为0

下图展示了计算的过程 ↓


最终的二进制,就是整数部分的合集

写出来大概是这样:

0001 1001 1001 1001 1001 ...

可以看到,1001 的部分,是无限循环的

我们用二进制的小数把它写出来大概是这样

0.0001 1001 1001 1001 1001 ...

它相当于

你会发现,它并不等于0.1

它只是一个近似值

所以,二进制保留的位数越多,精度也就越高


早期的计算机其实是不能处理浮点数的

直到IEEE 754 标准出现后,计算机才能处理浮点数

根据IEEE 754 标准,float类型,共4个字节,32个bit位

其中指数部分占8位,小数部分占23位

那么 指数部分小数部分 分别用来保存什么呢?

我们依然以 数字 0.1 为例,我们刚才已经得到了它的二进制

0.0001 1001 1001 1001 1001 ...

按照IEEE 754标准,我们需要把它的小数点,向右移动

直到整数部分是1为止

0.0001 1001 1001 1001 1001 ...
//小数点向右移动4位
//相当于乘以2的4次方
0001.1001 1001 1001 1001 ...
//也就是
1.1001 1001 1001 1001 ...
//为了维持数字大小不变
//再乘以2的-4次方

最终变成

float小数部分只能保存23位

-4 就是 指数部分

1001......就是 小数部分

小数点的位置不是固定的,而是浮动的,故名:浮点数


了解到这一点,你就能够接受更多看起来奇怪而有趣的现象

比如

float f1=0.4f;
double d1=0.4;
System.out.println(f1==d1);//false
System.out.println(f1>d1); //true

f1还原为10进制,结果为0.40000000596046450000

d1还原为10进制,结果为0.40000000000000000000


关于二进制的底层,还有很多问题,有待我们探索

多了解一点,就少一些困惑



相关推荐

MyBatis的SQL执行流程不清楚?看完这一篇就够了

推荐学习真香警告!Alibaba珍藏版mybatis手写文档,刷起来...

SpringBoot开发必备!49个内置工具类,让你的代码效率翻倍!

作为一名Java开发者,你是否经常为字符串处理、文件操作、数据验证等重复性代码头疼?SpringBoot的武器库里藏着...

C# 基于命名管道(Named Pipes) 的进程间通信(IPC)

基于命名管道(NamedPipes)的进程间通信(IPC),用于在同一台机器不同进程之间进行高效、可靠的数据传输,是一种基于消息或流的通信机制。管道有一个唯一的名称,客户端和服务器端通过名称连接到...

十年之重修MyBatis原理(mybatis方法重载)

弱小和无知并不是生存的障碍,傲慢才是。--------面试者...

C#串口通信(c#串口通信界面)

串口通信(SerialCommunications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于串行通信方式,能够实现远距离通信,长度可达1200米。尽管比...

C#中使用命名管道进行进程通信的实例

1新建解决方案NamedPipeExample...

继GitHub之后 OpenAI为ChatGPT推出OneDrive和SharePoint连接器

上周,OpenAI宣布推出ChatGPT的GitHub连接器,允许用户对其源代码库进行深入研究。将GitHub与ChatGPT连接后,用户可以提出问题,深度研究代理将读取和搜索存储库的...

Power BI:如何在SharePoint中嵌入Power BI报告?

问题描述:今天业务同事来询问如何才能将自己开发的PowerBI报告嵌入团队使用的SharePoint页面中,以更直观地和团队成员分享可视化报告。(SharePoint是微软推出的可以用来存储、整理、...

O365(世纪互联)SharePoint 之调查列表简单介绍

前言SharePoint中为了提供了很多开箱即用的应用程序,比如调查列表就是其中之一,同样,在O365版本里(国际版和世纪互联版本均可),也有这样的调查列表可以供我们使用,而使用起来非常方便和快速,就...

制作Excel电子表格必备的:Excel 2021 mac中文版

MicrosoftExcel2021forMac是一款运行在Mac平台上的办公软件,OfficeExcel2021forMac中文版是办公必不可少的软件,主要用于制作电子表格等,这里带...

微软SharePoint新特性:能以邮件方式向目标发送新闻内容

IT之家8月30日消息,微软今天发布新闻稿,宣布为SharePoint服务引入新特性,允许企业将新闻动态转换为电子邮件,并以时事通讯、安全公告、警告等主题发送给感兴趣的用户。微软在新闻稿中...

在Access中创建Sharepoint列表的链接表

在Access中提供了一个DoCmd.TransferSharePointList方法,一行代码就可以搞定。使用TransferSharePointList方法从SharePointFoun...

BBC推荐:12月最值得一看的5部电影 Five films to watch in December

年终岁末,还有哪些精彩电影在等着我们呢?迪士尼的《欢乐满人间2》绝对是合家欢电影的首选,超级英雄迷们将能看到索尼动画《蜘蛛侠:平行宇宙》,福尔摩斯的粉丝们千万别错过《福尔摩斯与华生》。还有朱莉亚·罗伯...

基于锂离子电池的电池荷电状态 (SOC) 和运行健康状态 (SOH) 估计技术

简介基于锂离子(Li-ion)电池单元的电池组广泛用于各种应用,例如:混合动力汽车(HEV)、电动汽车(EV)、可供日后使用的再生能源储存以及用于各种目的(电网稳定性、调峰和再生能源时移等)的...

深入解析电池充电状态 (SOC) 和运行状态 (SOH) 估计技术

基于锂离子(Li-ion)电池单元的电池组广泛用于各种应用,例如:混合动力汽车(HEV)、电动汽车(EV)、可供日后使用的再生能源储存以及用于各种目的(电网稳定性、调峰和再生能源时移等)的电网...

取消回复欢迎 发表评论: