0.1+0.2为什么不等于0.3

news2024/12/23 15:40:56

在这里插入图片描述

目录

    • 一、0.1+0.2是如何执行的?
      • 1、转成浮点数
      • 2、浮点数相加
      • 3、浮点数转成十进制
    • 二、BigDecimal

大家好,我是哪吒。

最近碰到一个问题,很有趣,我就不贴代码了,要不你们会以为我在无中生有。

在这里插入图片描述

我现在的心情很复杂,我想静静。

我只知道浮点数相加是丢失精度的,但是为什么会丢精度,我就不知道了。

一、0.1+0.2是如何执行的?

1、转成浮点数

浮点数在计算机内部是以二进制的形式存储的,而有些十进制的小数在二进制下无法精确表示,因此在进行浮点数运算时可能会存在精度误差。

浮点数分为单精度对应32位操作系统和双精度对应64位操作系统。目前的操作系统大多是64位操作系统,故这里只解释一下二进制如何转成双精度浮点数的二进制。

双精度浮点数用1位表示符号位,11位表示指数位,52位表示小数位,如下图所示:

在这里插入图片描述
符号位:正数为0,负数为1;
指数位:阶数+偏移量,阶数是:2^e-1^-1

e为阶码的位数。偏移量是把小数点移动到整数位只有1时移动的位数,正数表示向左移,负数表示向右移;

小数位:即二进制小数点后面的数。

接下来把0.1转成的二进制0.0001100110011001 …转成浮点数形式的二进制。

先要把小数点移动到整数位只有1,要向右移动4位,故偏移量为−4,通过指位数的计算公式2^11-1^-1-4=1019

把1019转成二进制为1111111011,不够11位要补零,最终得出指位数为01111111011;

小数位为100110011001… ,因为小数位只能保留52位,第53位为1故进1。

转换结果如下图所示:

在这里插入图片描述
同理,再把 0.2 转成的二进制0.0011 0011 0011 0011… 转成浮点数形式的二进制,转换结果如下图所示:

在这里插入图片描述

2、浮点数相加

浮点数相加时,需要先比较指位数是否一致,如果一致则小数位直接相加,如果不一致,要先把指位数调成一致的,指位数小的向大的调整。

为了行文方便,把0.1转成的浮点数称为为0.1,把0.2转成的浮点数称为0.2。

0.1的指数位是1019 ,0.2的指数位是1020 。故要把0.1的指数位加1,即把0.1的小数点向左移动1位,另外浮点数的整数位固定为1,过程如下所示

浮点数相加时,需要先比较指位数是否一致,如果一致则小数位直接相加,如果不一致,要先把指位数调成一致的,指位数小的向大的调整。

为了行文方便,把0.1转成的浮点数称为为0.1,把0.2转成的浮点数称为0.2。

0.1的指数位是1019 ,0.2的指数位是1020 。故要把0.1的指数位加1,即把0.1的小数点向左移动1位,另外浮点数的整数位固定为1,过程如下所示

1.1001100110011001100110011001100110011001100110011010   原先
0.11001100110011001100110011001100110011001100110011010  移动后  
0.1100110011001100110011001100110011001100110011001101   将小数的第53位舍去,因为为0故不需进1

导致0.1的小数位变成如下所示:

在这里插入图片描述
会发现现在的小数位多出了一位,超出了52位,故要把小数位最后一位截掉,小数位最后一位是1,故要进1,如下所示:

10110011001100110011001100110011001100110011001100111
1011001100110011001100110011001100110011001100110100

截掉小数位的最后一位相当把小数点向左移了一位,故指数位要加1,此时的指数是0.2的指数1021 ,加1后变成1021 ,转成二进制为01111111101 ,那么相加后的浮点数如下所示:

在这里插入图片描述

3、浮点数转成十进制

在这里插入图片描述

因此,0.1+0.2 不等于 0.3 ,因为在 0.1+0.2 的计算过程中发生了两次精度丢失。

  • 第一次是在 0.1 和 0.2 转成双精度二进制浮点数时,由于二进制浮点数的小数位只能存储52位,导致小数点后第53位的数要进行为1则进1为0则舍去的操作,从而造成一次精度丢失。
  • 第二次在 0.1 和 0.2 转成二进制浮点数后,二进制浮点数相加的过程中,小数位相加导致小数位多出了一位,又要让第53位的数进行为1则进1为0则舍去的操作,又造成一次精度丢失。最终导致 0.1+0.2 不等于0.3 。

所以,在进行浮点数计算的时候,通常采用BigDecimal。

二、BigDecimal

老大,没搞错吧。

在这里插入图片描述

使用 BigDecimal 表示和计算浮点数,要使用字符串的构造方法来初始化 BigDecimal。

在这里插入图片描述

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机航迹规划:五种最新智能优化算法(KOA、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法(KOA、COA、LSO、GRO、LO)简介 1、开普勒优化算法KOA 开普勒优化算法(Kepler optimization algorithm,KOA)由Mohamed Abdel-Basset等人于2023年提出。五种最新优化算法(SWO、ZOA、EVO、KOA、…

如何在Visual Studio上创建项目并运行【超级详细】

工欲善其事,必先利其器。想要学好编程,首先要把手中的工具利用好,今天小编教一下大家如何在史上最强大的编译器--Visual Studio上创建项目。🍗 一.打开编译器🍗 双击你电脑上的vs,(2012,2019,2022)都行。&…

【原理篇】四、自定义starter

文章目录 1、案例分析2、业务功能的实现3、中途调试4、开启定时任务打印报表5、引入属性配置类,写活业务参数配置6、拦截器7、开启yml提示功能 做一个记录系统访客独立IP访问次数的功能,并把它自定义成一个starter,实现:在现有项目…

systemctl enable docker.service报错“Failed to execute operation: Bad message“

将docker加入到开机自启,报错: 解决: 重新粘贴复制: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target…

【基带开发】AD9361通信基础:复数乘法 除法

复数 是实数和虚数的组合 例子:3.6 4i, −0.02 1.2i, 25 − 0.3i, 0 2i 乘法 除法

apple mobile device ethernet

莫名其妙使用了一次apple mobile device ethernet,原本正常的网络突然之间抽筋了,在网卡界面看到有两个,以太网3原本启用状态,禁用恢复。 通过搜索apple mobile device ethernet,在网上看到该答案,原来是接…

DDD技术方案落地实践

1. 引言 从接触领域驱动设计的初学阶段,到实现一个旧系统改造到DDD模型,再到按DDD规范落地的3个的项目。对于领域驱动模型设计研发,从开始的各种疑惑到吸收各种先进的理念,目前在技术实施这一块已经基本比较成熟。在既往经验中总结…

PPT NO.3 如何设置日期自动更新

打开PPT,停留在你想放入时间的那页上: ​ 点击“插入”-->"时间和日期": 然后会弹出一个窗口, 选择“日期和时间”,自动更新里面可以选择自己喜欢的日期格式,左下角“应用”就是当前的这张ppt&#xff0…

Workbench环境中常见问题

问题描述:1 解决方案:2 问题描述:在WB中启动Fluent,报错,提示 “The requested operatjon requires elevation” 解决方案:这个问题是因为WB主程序没有管理员权限导致。使用管理员权限启动WB后&#xff0c…

机器学习练习1

线性回归 数据集模型,第一列代表人口,第二列代表利润 此处的线性回归 与 常规的 y wx b 不同的是 将b换成了w的一部分 故需要在数据集x前面加个1, 求出b . 可以简化计算,只需要一个乘法就可以

音频恢复怎么做?这3招很管用!

“我是一名电台主播,所以经常需要用电脑录制并保存一些音频,今天想对某期节目进行加工时,突然有一部分音频丢失了,有什么方法能找回这些音频吗?” 在日常工作中,或许我们也会将很多重要的音频文件保存在电脑…

论文速览 | TRS 2023: 使用合成微多普勒频谱进行城市鸟类和无人机分类

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 | TRS 2023: Urban Bird-Drone Classification with Synthetic Micro-Doppler Spectrograms 原始论文:D. White, M. Jahangir, C. J. Baker and M. Antoniou, “Urban Bird-Drone…

【CSP认证考试】202309-1:坐标变换(其一)100分解题思路+代码

解题思路 暴力解决,不考虑时空开销就一直用for循环也可以做出来。按照题目意思输入两个数组,然后将第一个输入的数组的x部分累加起来记作x,再将y部分累加起来记作y。再将第二个数组的x部分都加上x,y部分加上y。最后输出第二个数组…

Git的入门详细教程

🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​ 🌟在这里,我要推荐给大家我的专栏《git》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…

网络原理---拿捏TCP机制原理

文章目录 确认应答机制超时重传机制连接管理机制三次握手(建立连接)三次握手的流程三次握手的状态转换 四次挥手(断开连接)四次挥手的流程四次挥手的状态转换 滑动窗口机制流量控制机制拥塞控制机制延迟应答机制捎带应答机制粘包问…

网络工程师回顾学习(第一部分)

根据书本目录,写下需要记忆的地方: 参考之前的笔记: 网络工程师回答问题_one day321的博客-CSDN博客 重构第一部分需要记忆的: 第一章:计算机网络概论 计算机网络的定义和分类:计算机网络是指将地理位…

【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退

🎯添加⽂件–场景⼀ 🎯在包含.git的⽬录下新建⼀个ReadMe⽂件,我们可以使⽤ git add 命令可以将⽂件添加到暂存区: • 添加⼀个或多个⽂件到暂存区: git add [file1] [file2] … • 添加指定⽬录到暂存区,…

【项目总结】基于SpringBoot+Ansj分词+正倒排索引的Java文档搜索引擎项目总结

文章目录 项目介绍(开发背景)主要用到的技术点前端后端Ansj分词实现索引模块实现Parser类实现Index类完善Parser类优化制作索引速度 实现搜索模块实现DocSearcher类处理暂停词 项目编写过程中遇到的困难点上传部署总结 项目介绍(开发背景&…

【紫光同创国产FPGA教程】【PGC1/2KG第六章】密码锁实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC…

排序算法的空间复杂度和时间复杂度

一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…