一文大白话讲清楚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这样更加准确的库去计算

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)

微信小程序读取bin文件内容 读取用户选择bin文件,并解析数据内容,分包发送给蓝牙设备; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档: getFileSystemManager 关于App端读取bin文件,请查看&…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; private List<List<Integer>> ret;private List<Integer> path;private int n,k;public List<List<Integer>> combine(int _n, int _k) {n _n;k _k;path new ArrayList<>();ret…

鸿蒙开发实战之“使用HiLog和HiSysEvent进行日志与系统事件管理”

HiLog和HiSysEvent作为鸿蒙&#xff08;HarmonyOS&#xff09;系统中进行日志记录和系统事件管理的关键组件&#xff0c;为开发者提供了强大的工具来追踪系统行为、调试应用以及监控设备状态。它们不仅简化了日志管理和事件追踪的流程&#xff0c;还提高了开发效率和系统可维护…

Linux(Centos 7.6)yum源配置

yum是rpm包的管理工具&#xff0c;可以自动安装、升级、删除软件包的功能&#xff0c;可以自动解决软件包之间的依赖关系&#xff0c;使得用户更方便软件包的管理。要使用yum必须要进行配置&#xff0c;个人将其分为三类&#xff0c;本地yum源、局域网yum源、第三方yum源&#…

数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误

文章目录 背景一、步骤1.分析阶段2.查看nginx3.修改用户&#xff08;也可以修改所有者权限&#xff09; 背景 故障报错&#xff1a; nginx报错信息&#xff1a; 2024/12/19 15:25:31 [crit, 500299#0: *249 onen0 " /var/lib/nginx/tmp/cient body/0000000001" f…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因&#xff1a; 后端使用分布式id, id为19位数&#xff0c;导致精度丢失 &#xff0c;前端解决方法 这个是通过浏览器请求回来的数据&#xff0c;这个时候id 数据已经丢失了&#xff0c;在数据库查询不到&#xff0c;在调获详情接口的时候会有问题 实际的&#xff1a; 解决…

十大排序---下

文章目录 前言一、归并排序二、快速排序三、计数排序四、桶排序五、基数排序总结 前言 今天我们来继续学习十大排序中剩下的五个。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、归并排序 归并排序&#xff08;Merge sort&#xff09;是建立在归…

Git如何设置和修改当前分支跟踪的上游分支

目录 前言 背景 设置当前分支跟踪的上游分支 当前分支已有关联&#xff0c;删除其关联&#xff0c;重新设置上游 常用的分支操作 参考资料 前言 仅做学习记录&#xff0c;侵删 背景 在项目开发过程中&#xff0c;从master新建分支时&#xff0c;会出现没有追踪的上游分…

【笔记】Linux中vim编辑器回忆录

&#xff08;一&#xff09;替换 末行模式中 替换整个文本的某个字符为某个东西 全局替换 &#xff1a;%s/旧字符/新字符/g &#xff1a;进入命令行 % 全局范围 s 替换命令 /旧字符/新字符/ 将旧字符换为新字符 g 全局替换 局部范围替换 &#xff1a;开始行号&#xff0c;…

【玩转MacBook】Git安装

Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git&#xff0c;所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令&#xff1a; /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…

字符串存储、分割相关总结(strncpy 函数和strtok() 函数相关)

1.想用这些函数都需要导入头文件 #include<string.h> 2.怎么创建字符串并输入 #define maxsize 100 char a[maxsize1];//创建字符串&#xff0c;预留一个位置放\0 【1】scanf("%s",a);//使用 scanf 函数读取不带空格的字符串 【2】fgets(a, sizeof(a), stdi…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块

目录 一、光敏/热释电模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;AS312 &#x1f319;简介 &#x1f319;特性 &#x1f505;LDR &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#x…

基于AI的增强型日内成交量比率概率预测在美股市场中的表现优于现有的基准

“IVE: Enhanced Probabilistic Forecasting of Intraday Volume Ratio with Transformers” 论文地址&#xff1a;https://arxiv.org/pdf/2411.10956 摘要 本文介绍了一种创新的金融市场成交量比预测技术&#xff0c;特别适用于VWAP&#xff08;成交量加权平均价格&#xff…

Tauri2+Leptos开发桌面应用--Sqlite数据库操作

在之前工作&#xff08;使用Tauri Leptos开发带系统托盘桌面应用-CSDN博客&#xff09;的基础上&#xff0c;继续尝试对本地Sqlite数据库进行读、写、删除操作&#xff0c;开发环境还是VS CodeRust-analyzer。 最终程序界面如下&#xff1a; 主要参考文章&#xff1a;Building…

设计模式之状态模式:自动售货机的喜怒哀乐

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、状态模式概述 \quad 在我们的日常生活中&#xff0c;很多事物都具有不同的状态。比如我们经常使用的自动售货机&#xff0c;它就具有多种状态…

4.银河麒麟V10(ARM) 离线安装 MySQL

1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…

多模态论文笔记——LLaVA

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型&#xff1a;LLaVA。处理包含图像和文本的多模态数据&#xff0c;并生成合理准确的回答。 文章目录 论文模型架构视觉编码器语言模型多模态融…

【Sentinel】初识Sentinel

目录 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 1.1.2.超时处理 1.1.3.仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 1.1.雪崩问题及解决方案 1.1.1.…