一文大白话讲清楚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.rhkb.cn/news/497277.html

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

相关文章

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题:Windows上缺少xaudio2_9.dll是什么原因? xaudio2_9.dll是DirectX音频处理库的一个组件,它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时,如果系统提示缺少xaudio2_9.dll文件&#xf…

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

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

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力:空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言:马斯克Grok 2.0的横空出世 在人工智能(AI)领域,竞争从未停止。随着大型语言模型(LLM)的快速发展,各大科技巨头纷纷推出自己的AI模型,试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…

2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)

nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器,同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网:https://nginx.org/ Nginx 应用场景 静态…

C 实现植物大战僵尸(二)

C 实现植物大战僵尸(二) 前文链接,C 实现植物大战僵尸(一) 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

域内的三种委派方式

域委派:使得上游服务能使用用户凭据访问下游服务,使得下游服务根据域用户判断权限,例如: web 用户 hack ---------------访问------------------> web 服务器 ( www-data 域服务账户运行)-------------…

GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取

大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物(特别是红树林、盐沼和海草&…

module ‘django.db.models‘ has no attribute ‘FieldDoesNotExist‘

module ‘django.db.models’ has no attribute ‘FieldDoesNotExist’ xadmin报错 原因 django与xadmin版本不匹配。 django==3.2.7 xadmin-django==3.0.2解决方案 在xadmin/view/edit.py的388行改为 from django.core import exceptions if self.request_method ==

数据结构(哈希表(中)纯概念版)

前言 哈希表(Hash Table)是计算机科学中的一个基础而重要的数据结构,它广泛评估各种算法和系统中,尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度,存储表在性能要求较高的应用中表现得非…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路,也称为传输介质或传输媒介,并不包含在计算机网络体系结构中,而是处于物理层之下。 一、传输媒体的分类 导向型媒体:电磁波被导引沿着固体媒体传播。常见的导向…

PPT画图——如何设置导致图片为600dpi

winr,输入regedit打开注册表 按路径找,HKEY_CURRENT_USER\Software\Microsoft\Office\XX.0\PowerPoint\Options(xx为版本号,16.0 or 15.0或则其他)。名称命名:ExportBitmapResolution 保存即可,…

接口测试的原则、用例与流程

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、接口的介绍 软件测试中,常说的接口有两种:图形用户接口(GUI,人与程序的接口)、应用程序编程接口…