一文大白话讲清楚javascript浮点数精度丢失和解决策略

文章目录

  • 一文大白话讲清楚javascript浮点数精度丢失和解决策略
  • 1.问题的来源北京
  • 2. 浮点数的存储二进制存储
  • 3.精度丢失解决方案

一文大白话讲清楚javascript浮点数精度丢失和解决策略

1.问题的来源北京

  • 我们先看一个经典javascript问题,关于等值判断
let num=0.1+0.2
console.log(num==0.3)//false
console.log(num===0.3)//false
  • 虎躯一震,啊,0.1+0.2竟然不等于0.3,那是为什么呢
  • 问题就出在0.1+0.2在计算机语言中还真不等于0.3
  • 为啥呢,原因在于计算机对于浮点数的二进制储存方式而导致的,
  • 0.1在计算机里的二进制储存方式为0.00011001100110011001100110011001100110011001100110011010
  • 0.2为0.0011001100110011001100110011001100110011001100110011010
  • 加起来等于0.0100110011001100110011001100110011001100110011001100111
  • 转化为十进制等于是 0.30000000000000004
  • 这不就是是 0.1+0.2=0.30000000000000004!=0.3的原因了
  • 那又蒙了,这么长一串010101又是个啥呀,别急,咱们下面开始讲

2. 浮点数的存储二进制存储

  • 我们知道,计算机的万事万物,最后都要归化为01序列,计算机才能识别并计算
  • 浮点数也一样,浮点数要进入计算,必须转化为二进制的01序列才可以计算。
  • 但是有个问题,就是我们知道浮点数有有限和无限之说。
  • 1÷2=0.5这是有限的,我们把0.5转化成二进制就可以
  • 但是碰到像1÷3=0.3333333…无限循环这种,那就没法整了。因为存储空间是有限,数是无限的,肯定存不了。那怎办,只能取一个近似值来替代。
  • 在js里面,浮点数属于Number类型,Number类型采用的IEEE754规范的64位双精度浮点编码。
  • 对于一个整数,我们很随意的转化为二进制,这没问题,
  • 但对于浮点数来说,有一个小数点的存在, 转化后的二进制小数点位置不统一。最好是让小数点位置固定,怎么办,用二进制科学计数法。
  • X=a*2^e
  • a的值为或者1,e为小数点移动的位置
  • 比如,27.0转化成二进制为11011.0
  • 用科学计数法表示
  • 1.10110*2^4
  • js是双精度浮点数存储,长度为8个字节,也就是64个比特位
  • 第一位S,是符号位,代表正负
  • 其后的11为指数,可正可负,指数的偏移量为1023,1位正负 +10位指数量,所以偏移量是1023
  • 最后的52位是尾数,超出的部分自动进1舍0
  • 所以27.0,,转化为二进制
  • 就是0+10000000011+011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  • 这就就明白了吧

3.精度丢失解决方案

  1. 整数法
  • 先把浮点数化为整数,操作再转为浮点数。比如把0.1和0.2分别*10,计算完以后,再÷10
console.log((0.1*10+0.2*10)*10===0.3)//true
  1. 使用foFixed限制小数点位置
let num=0.1+0.2
console.log(parseFloat(num.toFixed(1))===0.3)//true
//之所以使用parseFloat转化num。toFixed,是因为num。toFixed返回的是字符串形式的"0.3"
  1. 利用第三方库
  • decimal.js或bignumber.js这样更加准确的库去计算

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

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

相关文章

C语言-数据结构-图

目录 一,图的概念 1,图的定义 2,图的基本术语 二,图的存储结构 1,邻接矩阵 2,邻接表 三,图的遍历 1,深度优先搜索 2,广度优先搜素 四,生成树和最小生成树 1,生成树的特点: 2,最小生成树 (1)普利姆算法Prim (2)普里姆算法思路 五,最短路径 1,Dijkstra算法 2,Fl…

C语言-数据结构-查找

目录 一,查找的概念 二,线性查找 1,顺序查找 2,折半查找 3,分块查找 三,树表的查找 1,二叉排序树 (1)查找方式: (2)、二叉排序树的插入和生成 (3)、二叉排序树的删除 2,平衡二叉树 (1)、什么是平衡二叉树 (2)、平衡二叉树的插入调整 (1)L…

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…

线程池基础知识

线程池: 顾名思义就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。 使用线程池的好处 降低资源消耗:通过重复利用已创建的线程降…

ARM 架构--通用寄存器状态寄存器控制寄存器特殊用途寄存器

目录 一?ARM 架构中的寄存器 ARM 架构中的寄存器 通用寄存器 状态寄存器 控制寄存器 特殊用途寄存器 总结 二 通用寄存器 ARM 架构中的通用寄存器 ARMv7 架构 ARMv8 架构 实例 ARMv7 架构 ARMv8 架构 三 状态寄存器 ARM 架构中的状态寄存器 状态寄存器 详细…

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…

【CSS in Depth 2 精译_098】17.3:CSS 动画延迟技术与填充模式设置 + 17.4:通过 CSS 动画传递意图的秘诀

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式 ✔️17.4 通过动画传递意图…

慧集通客户案例:致远OA与熵基考勤机集成方案

本原型公司是一家专注大健康产业的综合性高新科技形实体企业,按照单位的战略业务布局,围绕“做强做优、世界一流”的目标,加快内外部资源整合、加强业务协同、优化资源配置,有序推进大健康及相关产业的有机融合,加快构…

深度学习笔记(6)——循环神经网络RNN

循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) ht​fW​(ht−1​,xt​) h t h_t ht​是new state, h t − 1 h_{t-1} ht−1​是old state, x t x_t xt​是当前时间步的输入,所有时间步共享 f W…

电脑卡顿救星,Mem Reduct 智能清理 10%以上内存

作为一款专业的内存优化工具,Mem Reduct凭借其强大的功能和极致的性能表现,成为众多用户管理系统内存的首选软件。它采用先进的内存管理算法,通过调用系统底层API接口,能够智能识别并清理各类内存占用,包括但不限于系统…

kibana启动报错:Invalid character in header content [“kbn-name“]

启动时候kibana报错: 打开 kibana配置文件,config/kibana.yml,配置上server.name即可,如下:

短视频矩阵系统后端源码搭建实战与技术详解,支持OEM

一、引言 随着短视频行业的蓬勃发展,短视频矩阵系统成为了众多企业和创作者进行多平台内容运营的有力工具。后端作为整个系统的核心支撑,负责处理复杂的业务逻辑、数据存储与交互,其搭建的质量直接影响着系统的性能、稳定性和可扩展性。本文将…

sql group by 多个字段例子

有表如下; 获取某年份、某地区、某产品的销售总额, 或者根据需要把字段顺序换一下; insert into sales (product, year, region, amount) values (飞机,2000,东部,5); insert into sales (product, year, region, amount) values (飞机,2001,…

MVC 架构学习笔记

MVC 架构学习笔记 Service 与 DAO 层方法命名规约业务错误是用返回值来处理还是抛异常来处理 Service 与 DAO 层方法命名规约 CRUD 是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中 DataBa…

Java编程规约 :OOP 规约

文章目录 引言I OOP规约【强制】【推荐】II 知识扩展:库的分类:(一方、二方、三方库)选择定义III 术语npe异常引言 I OOP规约 【强制】 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx() 和…

RBAC权限控制

1、Spring Security 是一个功能强大的Java安全框架,它提供了全面的安全认证和授权的支持。 2 SpringSecurity配置类(源码逐行解析) Spring Security的配置类是实现安全控制的核心部分 开启Spring Security各种功能,以确保Web应…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图,如下: 图片可点击放大 接下来我们来介绍一下 推荐学习:GIS入门模型构建器Arcpy批量…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Web API和Web Services的区分

前些年一提及自动化测试,大多是指UI界面层的自动化测试。近几年,随着分层自动化测试概念的兴起,以及自动化测试自身的发展与细分,自动化测试包含了更多的内容。 API(Application ProgrammingInterface,应用程序编程接…

使用c#制作坐标

1、建立坐标 2、坐标系的放大缩小 3、标定刻度 4、实时显示鼠标在坐标系上的坐标 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using S…