js解决数字小数计算出现的精度丢失问题(2024-05-24)

精度丢失的原因

js小数进行数值运算时出现精度丢失问题

JavaScript 的number类型在进行运算时都先将十进制转二进制,此时,小数点后面的数字转二进制时会出现无限循环的问题。

为了避免这一个情况,要舍0进1,此时就会导致精度丢失问题

1、精度缺失

例如:0.1 + 0.2

0.1 也就是0.0001100110011001100110011001100110011001100110011001101
0.2 也就是0.001100110011001100110011001100110011001100110011001101即:
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.01001100110011001100110011001100110011001100110011001110.1+0.2 = 0.30000000000000004

结果0.0100110011001100110011001100110011001100110011001100111

再转换成十进制就是0.30000000000000004。

let num = 0.1 + 0.2 
// 0.30000000000004let num = 0.1*0.2
// 0.020000000000000004

2、解决办法

(1) 方法1

保留是几位小数,就先乘以位数的倍数(10表示一位),然后再除

要保留1位小数,就乘以10,然后再除10;

要保留2位小数,就乘以100,然后再除以100


0.14+0.1541
//0.29410000000000003Math.floor((0.14+0.1541)*10)/10
//0.2Math.floor((0.14+0.1541)*100)/100
//0.29Math.floor((0.14+0.1541)*1000)/1000
//0.294

(2) 方法2

使用toFixed 保留小数位数

0.1+0.2334
//0.33340000000000003(0.1+0.2334).toFixed()
//'0'(0.1+0.2334).toFixed(1)
//'0.3'(0.1+0.2334).toFixed(2)
//'0.33'(0.1+0.2334).toFixed(3)
//'0.333'

(3) 方法3 更推荐

10乘以小数的长度

计算的小数后的位数*10倍数

function add(num1, num2) {const num1Len = (num1.toString().split('.')[1] ).length;const num2Len = (num2.toString().split('.')[1] ).length;const maxLen = Math.pow(10, Math.max(num1Len, num2Len));const res = ((num1 * maxLen) + (num2 * maxLen)) / maxLenconsole.log(maxLen,res);
}console.log(0.2+0.1)               // 0.30000000000000004
add(0.2,0.1)                       // 10   0.3
//相当于 ((0.2*10) + (0.1*10))/10console.log(2.67+1.3)              // 3.9699999999999998
add(2.67,1.3)                      // 100  3.97
//相当于 ((2.67*100) + (1.3*100))/100console.log(2.217+1.3)             // 3.5170000000000003
add(2.217,1.3)                     // 1000 3.517
//相当于 ((2.217*1000) + (1.3*1000))/1000

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

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

相关文章

企业宽带跑pcdn会被查吗?

企业宽带使用PCDN技术,本身并不违反相关规定,因此一般不会被查。PCDN是一种内容分发网络技术,通过将内容缓存在离用户更近的服务器上,减少数据传输的延迟,提高访问速度。这种技术可以提高网页加载速度和视频播放流畅度…

Excel未响应时强关后,Excel插件消失

目录 我们分析一下插件消失的原因: 针对上面表现出来的2个问题,进行针对性的解决 : 1、不被关进去,是不是就没有后续的一系列的问题了,各自安好 2、保留住自动加载的行为 PS:配置受信任的位置注册列表…

2024电工杯B题保姆级分析完整思路+代码+数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目:大学生平衡膳食食谱的优化设计及评价 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析: 题目要求对两份一日膳食食谱进行营养分析和调整,然后设计优化的平衡膳…

生成模型 | 从 VAE 到 Diffusion Model (上)

文章目录 一,GAN(对抗式生成网络)二,Auto-Encoder(AE) 和 Denoising Auto-Encoder (DAE)三,VAE四,VQ-VAE (Vector Quantized Variational Autoencoder)VQ-VAE 2小总结: 五,DALL-E (O…

硅谷裸机云服务器性能测评哪些内容

硅谷裸机云服务器,作为云计算领域的一股新兴力量,近年来受到了广泛关注。其强大的性能和灵活性为用户提供了更高效、更稳定的云计算服务。那么,硅谷裸机云服务器的性能测评究竟包括哪些内容呢?接下来,我们就来科普一下。 首先&am…

如何让大模型更聪明?

如何让大模型更聪明? *随着人工智能技术的飞速发展,大模型在多个领域展现出了前所未有的能力,但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么,如何让大模型变得更聪明呢? 方向一:算法创新 …

留学培训行业PaaS应用系统架构的设计与实践

随着留学需求的增长和教育培训市场的不断扩大,留学培训行业正面临着越来越多的挑战和机遇。在这个背景下,利用PaaS(Platform as a Service)平台来构建留学培训行业的应用系统架构,将成为提升服务质量和效率的重要手段。…

Nacos 2.x 系列【8】集成 Spring Cloud Gateway

文章目录 1. 概述1.1 API 网关1.1 Spring Cloud Gateway 2. 集成案例2.1 入门案例2.2 动态路由 1. 概述 1.1 API 网关 API网关已经成为了微服务架构的一个标配组件,是系统对外的唯一入口。所有的客户端都通过统一的网关接入微服务,在网关层处理所有非业…

SSRF攻击技术

1、SSRF形成原因 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系…

思科模拟器--03.RIP协议路由--24.5.17

1.首先,先创建两个个人电脑:PC0和PC1和三个路由器:R1,R2和R3. (诀窍:建议用文本框标注一下重要简短的内容; 目的:降低失误概率,提高成功率!) 第0步:(个人电脑的IP,子网掩码和默认网关配置) 接着,可以先将个人电脑的IP和网关先配置一下…

ThreadLocal原理及使用

一、引言 在Java多线程编程中,ThreadLocal是一个非常有用的工具,它提供了一种将对象与线程关联起来的机制,使得每个线程都可以拥有自己独立的对象副本,从而避免了线程安全问题。然而,使用不当会导致内存泄漏问题。 二…

go 微服务框架kratos错误处理的使用方法及原理探究

通过go语言原生http中响应错误的实现方法,逐步了解和使用微服务框架 kratos 的错误处理方式,以及探究其实现原理。 一、go原生http响应错误信息的处理方法 处理方法: ①定义返回错误信息的结构体 ErrorResponse // 定义http返回错误信息的…

无人机飞手前途分析

无人机飞手的前途充满了各种可能性和挑战,这主要得益于无人机技术的快速发展和广泛应用。以下是对无人机飞手前途的一些分析: 1. 技术发展与需求增长:随着无人机技术的不断进步,其应用场景也在持续扩大。从地理测绘、巡检、农林植…

IT学习笔记--Kafka

Kafka概述: 定义: Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。 消息队列消息队列的两种模式: 点对点模式: 消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。 消息被消费以后&#…

Linux中解决普通用户使用不了sudo问题

目录 sudo的使用场景sudo使用不了的原因解决方法 sudo的使用场景 之前我们介绍了文件的权限问题 如果一个普通用户想去执行一个它命令之外的权限,只能使用sudo 比如普通用户使用yum去安装软件,需要sudo yum xxxx sudo使用不了的原因 这里我们用普通用户…

小恐龙跳一跳源码

小恐龙跳一跳源码是前两年就火爆过一次的小游戏源码,不知怎么了今年有火爆了,所以今天就吧这个源码分享出来了!有喜欢的直接下载就行,可以本地单机直接点击index.html进行运行,又或者放在虚拟机或者服务器上与朋友进行…

SAP-FICO-凭证编号控制

成本凭证编号KANK 如果自己的公司下没有,直接复制系统原有的就可以。使用系统默认即可。 如果不维护 会报错“CO-凭证编号分配对于成本控制范围****中的商业事务COIN无效” 财务凭证编号FBN1 可以用OBH2批量复制编号范围。 物料账期MMPV 财务账期OB52

python使用base加密解密

原理 base编码是一种加密解密措施,目前常用的有base16、base32和base64。其大致原理比较简单。 以base64为例,base64加密后共有64中字符。其加密过程是编码后将每3个字节作为一组,这样每组就有3*824位。将每6位作为一个单位进行编码&#xf…

1个逗号,提升Python代码质量

有些时候,我们会在Python代码中看到列表或其他科迭代对象的结尾会存在一个逗号: 而且编辑器和解释器都容许这种逗号的存在,它就叫作拖尾逗号。 通常是为了在频繁地增减数组元素的时候同时保证语法的正确,且拖尾逗号不占用数组的长…

MySQL 主备环境搭建 docker

MySQL 主备环境搭建 docker 拉取docker镜像 sudo docker pull mysql:8.0 启动容器 docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0配置 M…