教你一文解决 js 数字精度丢失问题

js中数字计算时丢失精度问题解决 在 JavaScript 中,浮点数运算时常会出现精度丢失问题,因为 JavaScript 使用 IEEE 754 双精度浮点数标准表示数字,这可能导致在进行数学运算时精度丢失。选择适合你需求的方法进行处理,可以帮助你避免在计算过程中出现的精度问题。方法可以将数字格式化为固定的小数位数,从而避免精度丢失。有时可以通过数学技巧来减少浮点数运算的误差,例如通过乘法和除法将所有运算转换为整数运算,最终再转换回浮点数。方法可以将浮点数转换为指定小数位数的字符串,避免了显示时的精度问题。 阅读详情

一、关于为什么要解决精度丢失

可以看下例子,因为js失去精度问题也是常见的问题,正常我们可以四舍五入或者 toFixed保留小数这种去解决
在这里插入图片描述
现在遇到问题是我们明知道计算结果是等于0.01的但是最后的结果确实true,如果我们遇到运算问题,小数数值比对问题,那么我们就必须要去解决他,否则也就会出现上者情况,出现逻辑判断出错问题

二、怎么解决js的计算精度丢失问题?

正常来说如果是 小数点保留后2位、3位等等,我们可以使用常见的 * 百位数、千位数 实现整位结果后 将结果在除以对应的数位实现结果,如下

console.log(5.22 - 5.21);

在这里插入图片描述

 console.log((5.22 * 100 - 5.21 * 100) / 100);

在这里插入图片描述

根据上方的描述我们再去着眼看我们最开始的例子
在这里插入图片描述
结果也就成了我们想要的结果

三、toPrecision 特定方法返回四舍五入长度字符串

当然toFixed也是可以实现对应的长度取舍效果的,因为各大浏览器针对toFixed的各类结果都是不同的有兴趣的同学可以参考下下面这篇文章
toFixed详解

在这里我们只介绍 toPrecision 参照方法详解
在这里插入图片描述

那么我们也就知道了此方法是用来干什么的
当然再有一点也就是从左到右 不为0的位置开始计算

上方举例 我们的结果是0.01

如果我们去使用toPrecision的话,那么要填写的参数则为1

在这里插入图片描述
返还的结果也就是我们想要的 0.01

然后我们搭配 parseFloat 对字符串进行一个浮点数值转换后,然后对比得出最后结果

console.log(5.22 - 5.21 < 0.01);
console.log((5.22 * 100 - 5.21 * 100) / 100 < 0.01);
var num = 5.22 - 5.21;
console.log(parseFloat(num.toPrecision(1)) < 0.01);

在这里插入图片描述

结语

✨ 每天创作一点点
✨ 开心快乐一整天
✨ 点赞关注加收藏
✨ 美好一天又一天

铁铁们 感谢支持 我需要你们的三连 👍👍👍
请添加图片描述

JS的浮点数计算精度丢失问题解决方案 近期在做项目的时候,遇到了一些JS浮点数精度的问题。这个问题,其实说大不大,说小不小。但是这次因为涉及到一些财务和结算的问题,然后突然发现这个小问题处理起来还是挺麻烦的。这里把相关的原因的问题的解决方案整理一下,也希望给各位提供一些参考。 阅读详情

相关推荐

解决JavaScript大数ID精度丢失问题

摘要:文章分析了JavaScript处理大数ID时的精度丢失问题,特别是在前后端分离系统中,雪花算法生成的19位Long类型ID超过JavaScript安全整数范围导致数据不一致。提出了使用Jackson的ToStringSerializer将Long类型ID序列化为字符串的解决方案,通过添加@JsonSerialize(using = ToStringSerializer.class)注解实现精确传输,避免前端精度丢失。该方案简单高效,无需修改前端代码,适用于各种分布式ID生成场景,有效解决了常见的大数I

qq_40603125的博客 1006

js运算精度丢失

js运算精度丢失问题(最终运算结果多了很多小数位)

ZWP_990527的博客 1万+

解决JavaScript数字精度丢失问题的方法

本文分为三个部分 JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用alert试试 (哈哈开玩笑)。 看看Java的运算结果 再看看Python 2. 大整数运算 16位和17位数竟然相等,没天理啊。 又如 var x = 9007199254740992 x + 1 == x // ? 看结果 三观又被颠覆了。 3. toFixed 不会四舍五入(Chrome) 线上曾经

【JS】js运算过程中失去精度问题,解决方案

运算过程中失去精度,如何解决

Owen的博客 3641

《深入浅出图神经网络:GNN原理解析》学习笔记

期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 2049

强化学习代码实现PPO

梯度更新:通过截断(clipping)限制策略更新幅度,避免策略变化过大影响稳定性。首先是数据预处理,将相关数据(状态、采取的动作、状态奖励、下一个状态)放到gpu上。根据当前状态 state,利用策略网络生成每个动作的概率分布 probs。2. 修改了策略模型的输出,从每个动作的概率分布变成了动作的均值和方差。1. 修改了动作空间,离散空间变成了连续空间,使用正太分布来采样。3. 修改了动作的ratio的计算,从离散分布变成了正太分布计算。Update函数:通过经验缓冲数据来优化策略模型和价值模型。

wlxsp的博客 636

js小数运算出现的问题(精度丢失)及解决办法

以下是在项目中遇到的问题 购物车结算时,商品价格(33.01)-优惠券价格(5),本应该是28.01,但是实际的结果是28.009999999999998 之前真没遇到过这种问题,查了很多资料才了解到js 小数相加减是会出现精度丢失的问题 案例 本案例是在浏览器控制台里打印 出现这种问题的原因,查看详细原因(链接) 原因其实就是js number类型运算都需要先将十进制转二进制 但小数点后的位数转二进制会出现无限循环的问题,只能舍0入1,所以会出现小数点丢失问题,感兴趣的可以自己研究,链接在上面。 解决

kukulei2211的博客 3万+

ROS基础(一)——命令行代码(以小乌龟程序为例)

ROS学习(一)——命令行代码(以小乌龟程序为例)1 基础命令行语句1.1 roscore1.2 rqt_graph(显示系统计算图)1.3 rosnode(显示所有节点相关信息)1.4 rostopic(和话题相关)2 服务类型指令rosservice同时存在两只海龟3 指令记录 1 基础命令行语句 从大二四旋翼无人机编队后就没再接触过ROS了,最近由于科研任务需要重新捡起来,打算系统学一下!学习过程参考古月居老师的视频,有兴趣的同学可以去[BliBli]学习。 学习平台:Ubuntu 18.04 硬件

北理自动化小白 6267

说说 Javascript 数字精度丢失的问题,如何解决?

这个数无限循环,再大的内存它也存不下,所以不能存储一个相对于数学来说的值,只能存储一个近似值,当计算机存储后再取出时就会出现精度丢失问题。主要是存储二进制时小数点的偏移量最大为52位,最多可以表达的位数是2^53=9007199254740992,对应科学计数尾数是 9.007199254740992,这也是 JS 最多能表示的精度。计算机存储双精度浮点数需要先把十进制数转换为二进制的科学记数法的形式,然后计算机以自己的规则{符号位+(指数位+指数偏移量的二进制)+小数部分}存储二进制的科学记数法。

林恒的博客 1425

prplOS amx-fxgi调试-订阅subscribe

本文分析了prplOS中amx-fxgi订阅功能(subscribe)的实现与调试过程。通过梳理订阅流程发现,默认订阅失败主要由于acl规则限制导致。文章详细介绍了订阅的两个关键步骤:建立GET长连接和POST设置订阅路径,并通过修改代码绕过acl验证成功实现订阅功能。最终验证了在同一连接下订阅多个路径及实时接收状态更新的可行性,有效降低了设备查询负载。该方案为prplOS的实时数据监控提供了优化思路。

四儿家的小祖宗的博客 330

深度学习部署工程师--8(docker+TensorRT部署到推理+yolo人体检测)下

本文介绍了YOLOv5模型通过TensorRT加速部署的流程。首先需要检查磁盘空间,确保有30GB可用。文章对比了不同推理方式的性能:int8量化+TensorRT可达200FPS,纯TensorRT为166FPS,CUDA为147FPS,CPU为93FPS。重点讲解了将YOLOv5模型导出为ONNX格式的详细步骤,包括修改Detect类的forward方法以移除decode运算,使用git patch批量修改代码,安装必要的依赖库,以及通过onnx-graphsurgeon工具修改ONNX图结构。最终目标

FJN110的博客 494

【温故而知新】JavaScript数字精度丢失问题

在JavaScript中,由于基于IEEE 754标准的浮点数表示方法,导致在进行数字运算时可能会发生精度丢失的情况。由于计算机内部使用二进制来表示浮点数,而无法准确地用有限的二进制位数表示所有的实数。因此,浮点数在存储和计算时会存在舍入误差。比如,当进行小数运算时可能会出现精度丢失的情况。例如,0.1 + 0.2 的结果在JavaScript中不是期望的0.3,而是一个近似值0.30000000000000004。这是因为0.1和0.2在二进制表示中无法被精确表示,导致在计算时发生了舍入误差。

日常笔记/总结/系列知识梳理 1668

YOLOv11改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附创新修改后的C3k2DWRSeg)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv11中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPsYOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备。

Snu77的博客 4187

几种解决JS数字精度丢失的方法

在JavaScript中计算两个十进制数的和,有时候会出现令人惊讶的结果,相信这个大家也都知道了! 精度丢失 例如,我们在计算0.1 + 0.1得到的结果是0.2,但是计算0.1 + 0.2的结果并不是0.3,而是0.30000000000000004 这种现象不仅出现在加法,在减法中也会出现类似的结果。 例如1.2 - 1的结果是0.19999999999999996 不过这并不是JavaScript独有的,其他编程语言也会存在同样的问题。 例如在Python环境下输出。 print(.1 + .2)

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 6769

Codex 桌面端自定义模型列表为空 — 修复记录

摘要:Codex桌面端首次启动正常,但二次启动后出现中文界面且模型列表丢失。问题根源在于Electron的Chromium持久化状态损坏,导致UI渲染异常。解决方案包括:1) 将config.toml中的模型路径改为绝对路径;2) 删除损坏的状态文件.codex-global-state.json;3) 清除Chromium用户数据目录AppData\Roaming\Codex\web。验证显示修改后模型功能恢复正常,重装无效的原因是卸载未清除用户数据目录。

猿小白的博客 1154

Unreal5从入门到精通 专栏目录

欢迎来到“UE5从入门到精通”专栏!在这里,我们将带您踏上一段精彩的旅程,深入探索虚幻引擎5(Unreal Engine 5)的无限可能。不论您是游戏开发的新手,还是希望提升技能的开发者,这里都有适合您的内容。基础知识:了解虚幻引擎5的界面、功能和基本操作,为您的学习打下坚实的基础。项目实战:通过实际项目案例,帮助您从理论走向实践,真实体验游戏开发的每个环节。高级技巧:分享各种高级功能和技巧,包括蓝图、C++编程、材质编辑、光照和渲染等,让您能够创作出更具专业水准的作品。

TxNet 2988

【javascript】数据精度丢失问题

JavaScript中存在小数点精度丢失的问题是由于其使用的浮点数表示方式。JavaScript采用的是双精度浮点数表示法,也称为IEEE 754标准,它使用64位来表示一个数字,其中52位用于表示有效数字,而其他位用于表示符号、指数和特殊情况。由于使用有限的位数来表示无限的小数,JavaScript无法准确地表示某些小数。其中一个典型的示例是0.1,它在二进制中是一个无限循环的小数。当我们将0.1这样的小数转换为二进制进行存储时,存在近似表示的误差,因此在进行计算时会出现精度丢失的问题。

weixin_45274678的博客 1636

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JavaScript数字精度丢失问题总结

本文分为三个部分: 1、JS 数字精度丢失的一些典型问题(前端遇小数计算概率大,要有这个精度丢失的意识) 2、JS 数字精度丢失的原因(计算机用二进制存储数据,由于存储位置的限制有时会存在“舍去”。当模仿十进制进行四舍五入时,0舍1入,造成误差) 3、解决方案(一个对象+一个函数)(解决...

chenkan0603802的博客 1141

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js number 丢失精度_JavaScript精度丢失问题

JavaScript精度丢失问题。 javaScript中臭名昭著的BUG就是0.1+0.2 !== 0.3,因为精度问题,导致所有浮点数运算都是不安全的。正如下面的计算结果,它们并不是我们所预想的:0.1 + 0.2 = 0.300000000000000041 - 0.9 = 0.09999999999999998虽然很多人知道这个浮点数误差这个问题的,可是却不知道背后的原理以及解决...

weixin_42545636的博客 7027

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JavaScript 数字精度丢失的问题及解决方案

JavaScript 数字精度丢失的问题及解决方案

huihui_999的博客 3738

JavaScript数据精度丢失的底层原理及解决方案

IEEE 754标准是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。它定义了表示浮点数的格式(包括负零、-0、无穷大(Inf)和非数值(NaN))、特殊数值,以及这些数值的运算规则。IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,较少使用)和延伸双精确度(79比特以上,通常以80位实现)。其中,双精确度是JavaScript中数字的主要表示方式。

u014676858的博客 1301

JavaScript数字精度丢失问题解决方案

在使用javascript进行运算时经常会遇到计算结果不准确问题,该如何处理呢,本篇就来说说当javascript数字精度丢失时我们该怎么办

Sherry Tian的博客 810

JavaScript 金额运算精度丢失问题及解决方案

在 JavaScript 中,浮点数运算可能会产生精度丢失的问题,尤其在处理金额计算时,这可能会导致严重的业务逻辑错误。// false这些问题主要是由于JavaScript 使用 IEEE 754 双精度浮点数(64 位)来表示数字,某些小数无法用二进制精确表示,从而导致精度丢失。本篇文章将深入剖析 JavaScript金额计算精度丢失的原因,并提供多种解决方案来避免这些问题。JavaScript 的浮点运算容易导致金额计算误差,我们可以通过整数运算、、BigDecimal 库等方式来解决。

学习编程的小羊的博客 912
上一篇: React造轮子(reacthook实现一套自己的组件库)轮子公开课——第六课【Checkbox、CheckboxGroup】组件
下一篇: vue Template模板中针对属性如何写空白字符串占位符?(\u00a0)会是一个好的空格占位解决方案
归来巨星
归来巨星 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 5391粉丝 95原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归来巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值