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

在 JavaScript 中,数字精度丢失是一种普遍的问题。这是因为 JavaScript 内部的数字均以 IEEE 754 标准的双精度浮点数格式存储,这种格式只能精确表示有限个小数,而对于一些无限循环小数或无理数,无法精确表示,就会出现精度丢失的情况。

例如,对于十进制的 0.1,其在二进制中是一个无限循环小数,无法精确表示为有限个二进制小数位。因此,在 JavaScript 中,使用浮点数进行计算时,可能会出现一些不符合预期的结果,例如:

javascriptCopy Codeconsole.log(0.1 + 0.2); // 输出 0.30000000000000004

解决 JavaScript 数字精度丢失的方法可以包括:

  1. 使用整数进行计算:将需要计算的小数转换为整数,进行整数运算后再将结果转换回小数。
javascriptCopy Code// 实现小数相加函数
function add(a, b) {const precision = Math.max(getPrecision(a), getPrecision(b));const factor = Math.pow(10, precision);return (a * factor + b * factor) / factor;
}// 获取小数位数
function getPrecision(num) {const str = num.toString();const index = str.indexOf('.');return index === -1 ? 0 : str.length - index - 1;
}console.log(add(0.1, 0.2)); // 输出 0.3
  1. 使用第三方库:一些第三方库,例如 BigNumber.js、Decimal.js 等,提供了精确计算的方法,可以避免 JavaScript 数字精度丢失的问题。
javascriptCopy Code// 使用 BigNumber.js 实现小数相加函数
const BigNumber = require('bignumber.js');function add(a, b) {return new BigNumber(a).plus(new BigNumber(b)).toNumber();
}console.log(add(0.1, 0.2)); // 输出 0.3

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

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

相关文章

1-数组-有效的数独

这是数组的第一题,从现在开始开启数组篇章。力扣链接。 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【Redis配置】Linux下的Redis安装配置

压缩包方式的Redis下载与安装 进入官网 Redis官网:https://redis.io/download/ 往下翻可以找到其他版本的Redis,或者访问https://download.redis.io/releases/查找自己所需Redis版本。 下载自己所需版本 此处我选择下载的是6.2.14版本 上传到Linux…

墙地砖外形检测的技术方案-图像分割

基础原理 由于对碗口进行缺口检测,因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像,对图像进行边缘检测。这是属于图像分割中的内容,在图像的边缘中,可以利用导数算子对数字图像求差分,将边缘提取出来。 案例…

Vue:将以往的JQ页面,重构成Vue组件页面(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分,命名不要与HTML元素冲突。 1、根据UI提供的原型图,进行结构设计,结构设计的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、设计好结构后,开始写对应的组件&am…

pl/sql程序块的使用

-- Created on 2024-01-15 by ADMINISTRATOR declare -- Local variables hererecord_tablename varchar2(100);---test_record表名record_StartNo integer(19);---test_record开始编号temp_No integer(19);maxnbbh integer(19);nCnt integer : 20;fi…

ESP32 带字库显示中文终极方案

在持续的试错和进步之间发布过下面内容: TFT屏幕在arduino (esp 32)下的驱动,汉字显示和字库比较_arduino gc9a01显示汉字-CSDN博客 在esp32(esp8266) 提供软字库显示中文的解决方案_tft_espi汉字-CSDN博客 单片机上软字库换32进…

jar包热加载原理

第一次加载时,记录jar包的更新时间 lastModified jarLoader.getURLs()[0].openConnection().getLastModified(); 第二次加载时,比较jar的更新时间和第一次jar包更新时间,若不一致,说明jar包更新过了 if (jarLoader.getLastModi…

家用小型洗衣机哪款性价比高?好用的内衣洗衣机推荐

现在大多数的上班族,面临的都是早九晚六的工作,而且工作完下班回家还是面对各种各样的家务,特别是清洗需要换洗的洗衣,属实是有点辛苦了。可能很多人为了方便,每次洗衣服的都是把一堆衣服直接丢进洗衣机,直…

EVE-NG的环境导入IOL组件

IOL或IOS On Linux,也称为IOU或IOS On Unix。IOL是一个模拟器,一般仅思科使用。IOL指为i386架构编译的Linux版本。IOU指为Sparc架构编译的Unix(Solaris)版本。由于IOL是内部IOS版本,因此IOL只能由Cisco授权客户使用。需…

UniApp+Vue智慧工地信息化管理云平台源码(支持多工地使用)

智慧工地建设的意义 1、提高工程效率 智慧工地可以通过数字化手段,将工地的各个方面进行数字化存储和管理,从而实现的实时监测和共享。这可以大大提高工程的效率,减少工程中的人工干预,并且可以为后续的工程维护和升级提供便利。…

c++中的以及链表的基础使用

c中的& 通俗的立减即为对一个变量起别名。(是和指针有区别的) 以下为两个示例程序: 通过&代替了以往对地址的传递。从而实现了对a和b的交换。 p为a的别名,对p操作即为对a操作。故最后输出a的值为10. 链表的基础应用 链…

**FutureTask应用源码分析**(一)

1.1 FutureTask介绍 FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。 一般是配合Callable去使用。 异步任务启动之后,可以获取一个绑定当前异步任务的FutureTask。 可以基于FutureTask的方法去取消…

Windows11搭建Python环境(2)- Anaconda虚拟环境中安装Git

在搭建MetaGPT运行环境过程中,使用了Anaconda虚拟环境,在运行MetaGPT时出现错误: 可以看到是没有找到git指令。 在Windows上安装Git,可以直接去官网下载.exe文件,然后安装即可。 但是上面安装完成后,是无…

三方接口对接常见数据处理方式汇总

文章目录 数据请求格式application/json接收发送 multipart/form-data接收发送 application/x-www-form-urlencoded接收发送 text/xml接收发送 Request请求中各个数据载体获取方法HeaderParameterInputStreamAttribute 二次封装HttpServletRequest参考 验签与加密 日常开发中&a…

【mfc/VS2022】绘图工具设计-绘制基本图元1

基于:https://blog.csdn.net/weixin_51599044/article/details/111741111 实现的功能: 绘制图元的方法: 前5种图元的菜单项均在“绘制”菜单里。 1.直线:按下左键作为起点,按住左键拖动鼠标到你想设定的终点,然后放开…

使用Map.clear()、List.clear()方法,清空时注意!

对 Map、List 对象进行清空操作时,常常会使用 clear() 方法。 例如,清空 Map Map map new HashMap();map.put("key1","value1");map.put("key2","value2");System.out.println(map.size()); //2map.clear();Sy…

.gitignore文件设置了忽略但不生效,git提交过程解析

这里写目录标题 第一章、gitignore文件设置了忽略路径,但是不生效1.1)原因1.2)解决 第一章、gitignore文件设置了忽略路径,但是不生效 1.1)原因 在初次提交代码的时候,没有进行文件忽略,某些文…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

快慢指针-Floyd判圈算法

对于环形链表是否存在环的做法,普通算法可以通过额外Hash数组来存储链表元素,直到Hash数组中出现重复元素。时间复杂度O(n),空间复杂度O(n) Floyd判圈算法通过利用快慢指针的移动来实现,时间复杂度O(n)&am…