老生常谈之 JavaScript 中 0.1 + 0.2 != 0.3 的原因

先来一个模棱两可的说法:因为精度丢失、存储溢出的问题

先复习一下二进制的转换方法:

  1. 整数:除以基数,取余,自底向上
  2. 小数:乘以基数,取整,自顶向下
    二进制转换

接着,复习一下双精度浮点数(double)

  1. Number 类型使用IEEE754 标准 64位 存储
  • 符号位:1位,0 表示正数,1 表示负数
  • 指数位:11位,固定值(1023)+ 指数实际值
    • (2 ^ (e-1)) - 1 => (2 ^ (11 - 1)) - 1 = 1023
    • 这一步看不懂,可先跳过,待会解释
  • 小数位:52位
  1. 双精度浮点数即为每个数值分配 64位存储空间,以科学计数法的方式存储

中间插播一个小内容:怎么理解指数位

1、IEEE 754 标准中的双精度浮点数采用了带有偏移量的指数表示
2、具体来说,双精度浮点数的指数部分是一个11位的二进制数,其中最小值是全0(00000000000),最大值是全1(11111111111)。这11位的二进制数会被解释为一个无符号整数,然后从中减去一个偏移值来得到最终的指数。
3、IEEE 754 双精度浮点数的指数偏移值是 2 ( k − 1 ) − 1 2^{(k-1)} - 1 2(k1)1,其中 k 是指数部分的位数。对于双精度浮点数,k 是11,所以偏移值是 2 ( 11 − 1 ) − 1 = 1023 2^{(11-1)} - 1 = 1023 2(111)1=1023
4、例如,如果指数部分的二进制表示是 01111111111,那么对应的无符号整数是 2 10 − 1 = 1023 2^{10} - 1 = 1023 2101=1023。然后,减去偏移值 1023,最终得到实际的指数值为0。
5、这个偏移量的使用允许浮点数表示非常大和非常小的数,因为指数的范围可以从负数到正数。同时,由于使用偏移值,指数部分的二进制表示中并不包含真实的指数值,而是需要通过减去偏移值来得到真实的指数。

了解上面两个知识点之后,开始进入正文
第一步:0.1 转换二进制为:0.00011001…1001(循环)
第二步:二进制转换为科学计数法 = 1.1001 * 2^ (-4)
第三步:计算指数位 1023 + (-4) = 1019 = 01111111011
第四步:计算小数位,为1001无限循环
因此,0.1 = 符号位0 + 指数位01111111011 + 小数位1001…

由于小数位只有52为,因此第53位为1,截取保存的时候进了1,所以发生了精度丢失。 即后四位小数为 1001 + 1 = 1010

针对于0.2也进行同样分析,相加的时候同样也出现了截取保存的情况,即出现第二次精度丢失,所以最终转换为10进制的时候为 0.30000000000000004

综上所述:
1、由于js采用二进制处理数据,用IEEE 754双精度浮点数标准来存储 Number 类型
2、精度丢失非JS问题,而是IEEE 754标准存储位有限
3、过程中出现了两次精度丢失问题,一次在存储,一次在相加

解决方案:
1、两个数分别乘以100,得到结果再除以100

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

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

相关文章

【计算机基础】通过插件plantuml,实现在VScode里面绘制状态机

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

redis运维(十五) 集合

一 集合 ① 概念 集合的元素在redis里面的世界是member集合: setset集合当中不允许重复的元素,而且set集合当中元素是没有顺序的,不存在元素下标 ② sadd、smembers、srem ③ sismember、srandmember、spop、scard spop 命令用于移除集合中的指定 …

sql语法大全

1,创建数据库 create database 数据库名字; 2,查看所有的数据库名称 show databases; MySQL服务器已有4个数据库,这些数据库都是MySQL安装时自动创建的。 information_schema 和 performance_schema 数据库分别是 MySQL 服务器的数据字典(…

算法——滑动窗口(Sliding Window)

一、背景知识 滑动窗口算法(Sliding Window): 在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。题型一:固定长度题型二:不固定长度 二、例…

TypeScript 学习笔记 第二部分 webpack 创建typescript项目

【视频链接】尚硅谷TypeScript教程(李立超老师TS新课) 创建webpack 项目 IDE:webstorm 新建一个空的项目运行npm init初始化项目目录结构 1. 安装 webpack:构建工具webpack-cli: webpack的命令行工具typescript&am…

PCIE链路训练-状态机描述1

状态机描述 Config.linkwidth.start: 1. (1)Linkup 0 状态机没有执行链路宽度的升级(upconfiguration of the Link width):那么tx会在所有active的dsp上发送TS1,其中link num为具体内容&a…

git stash 用法总结

目录 1,介绍场景1:场景2: 2,常用命令2.1,基础2.2,进阶1,存储时指定备注2,通过索引来操作指定的存储3,修改存储规则 2.3,查看 stash 修改的具体内容 1&#xf…

摩尔定律,梅特卡夫定律,吉尔德定律

信息系统的三大定律(摩尔定律,梅特卡夫定律,吉尔德定律)有一个清晰的视角: 信息系统不是左边的生产消费系统,而是右边的交易系统,交易系统与生产消费典型的区别在于信息交易过程会产生新的信息,就像钱一样…

c语言——俄罗斯方块

一、游戏效果 俄罗斯方块 二. 游戏背景 俄罗斯方块是久负盛名的游戏,它也和贪吃蛇,扫雷等游戏位列经典游戏的⾏列。 《俄罗斯方块》(Tetris,俄文:Тетрис)是一款由俄罗斯人阿列克谢帕基特诺夫于1984…

java http

超文本传输协议 超文本/html 工作方式 get / url 请求获取相应报文 http://xxxxxxxxxxxx.com/user?xxx xxx 协议类型 - 服务器地址 -路径 path 请求格式: head / body path路径进行处理资源 等同于报文请求: GET: /users HTTP/1.1 Host:api.github.com 响应报文 请求方式…

京东数据分析平台(京东运营数据采集):2023年10月京东白酒品牌销售排行榜

鲸参谋监测的京东平台10月份白酒市场销售数据已出炉! 鲸参谋数据显示,10月份,京东平台上白酒的销量为340万,环比增长约16%,同比增长约37%;销售额为28亿,环比增长约20%,同比增长约122…

如何在Ubuntu的Linux系统中安装MySQL5.7数据库

前往MySQL数据库官网链接地址下载5.7数据库。 MySQL :: Download MySQL Community Server (Archived Versions)使用ssh的可视化工具将下载的mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz文件上传到Linux服务器,并解压文件 tar -zxvf mysql-5.7.40-linux-glibc2.12-x…

基于蛇优化算法优化概率神经网络PNN的分类预测 - 附代码

基于蛇优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蛇优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蛇优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

大数据预处理技术

文章目录 前言 大数据技术成为前沿专业 也是现在甚至未来的朝阳产业,大数据有分别是 数据预处理 数据存储 大数据处理和分析 数据可视化 部分组成 ,大数据行业有数据则称王,大数据的核心是数据本身 怎么获取有价值的数据呢?本章讲…

Cent OS 8.2 安装 自定义硬盘 固定IP VMware

时间:20231122 环境:win11 、VMware 16 pro、Cent OS 8.2 说明:自定义安装方法、自定义硬盘分区、固定IP且能联网 1、使用自定义的方式安装虚拟机 此处选择典型,则会自动安装系统,无法自定义硬件以及配置信息 选择…

CCF CSP认证 历年题目自练Day49

题目一 此题用暴力枚举做过(80分)现如今终于用二维前缀和做到满分。 试题编号: 202309-2 试题名称: 坐标变换(其二) 时间限制: 2.0s 内存限制: 512.0MB 问题描述: 问题…

NFC:应用场景广泛的短距离通信技术

NFC:应用场景广泛的短距离通信技术 一、NFC 技术介绍1.1 NFC 技术应用场景1.2 NFC 技术优点1.3 NFC 工作原理 二、NFC 开发2.1 NFC 应用开发流程2.2 NFC 读取和写入2.3 NFC 读写功能示例 三、总结 一、NFC 技术介绍 NFC (Near-field communication&…

分类预测 | Matlab实现基于PSO-PNN粒子群算法优化概率神经网络的数据分类预测

分类预测 | Matlab实现基于PSO-PNN粒子群算法优化概率神经网络的数据分类预测 目录 分类预测 | Matlab实现基于PSO-PNN粒子群算法优化概率神经网络的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于PSO-PNN粒子群算法优化概率神经网络的数据…

hadoop在本地创建文件,然后将文件拷贝/上传到HDFS

1.要$cd {对应目录}进入到对应目录,一般为 cd /usr/local/hadoop/ 2.创建文件,$sudo gedit {文件名},例 sudo gedit test.txt 然后在弹出的txt文件输入内容,点击右上角的保存之后,关闭即可。 3.拷贝本地文件到HDF…

RPG项目_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…