js/ts数值计算精度丢失问题及解决方案

ops/2025/1/31 11:29:49/

文章目录

    • 概念及问题
    • 问题分析
    • 解决方案
      • 方案一
      • 方案二
      • 方案其它——用成熟的库

概念及问题

  • js中处理浮点数运算时会出现精度丢失
  • js中整数和浮点数都属于Number数据类型,所有的数字都是以64位浮点数形式存储,整数也是如此。所以打印x.00这样的浮点数的结果为x而非x.00。
  • 当浮点数进行数学运算(加减乘除)时,有时会出现问题,如下4张图:在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

问题分析

js中数值采用IEEE754 标准的64位双精度浮点数,对于64位的浮点数在内存中的表示,最高的1位是符号位,接着的11位是指数,剩下的52位为有效数字(52+11+1 = 64位):

  • 第0位:符号位,s表示,0表示正数,1表示负数
  • 1~11位:储存指数部分,e表示
  • 12~63位:存储小数部分(即有效数字),f表示。

符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。

IEEE754 规定,有效数字第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字总是1.xx…xx的形式,其中xx…xx的部分保存在64位浮点数之中,最长可能为52位。

因此,js提供的有效数字最长为53个二进制位(64位浮点的后52位 + 有效数字第一位的1)

那么,js中计算0.1+0.2时,到底发生了什么?

  1. 十进制的0.1和0.2会转为二进制(浮点数用二进制表达时,是无穷无止的)如:0.1 => 0.0001100110011001…(无限)
  2. IEEE 754标准的64位双精度浮点数的小数部分最多支持53位二进制,所以两者相加之后得到的二进制就是大概这个样子:0.010011001100110011001100110011001100…
  3. 最终,以你为浮点数小数位的限制而阶段的二进制数字,再转为十进制,就成了0.30000000000000004,所以在进行算术计算时就产生了误差。

解决方案

方案一

数值转整 —— 计算完毕 —— 数值回转
在这里插入图片描述
局限性:小数位数不确定这个方法行不通

方案二

js内置的toFixed()方法可以将数值转换成保留指定小数位的字符串。注意:此方式适用于简单的数值运算,需要注意舍入误差(因为转换后是字符串,丢失了浮点数的特性,最后结果肯定存在微小的误差。)
在这里插入图片描述
PS:toFixed() 是一个 四舍六入五成双 的诡异方法(也叫银行家算法)。
“四舍六入五成双”的含义: 对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种舍入规则是“4舍6入5凑偶”。

“4舍6入5凑偶”:4指 <=4时舍去,6指>=6时进上,5指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后面无有效数字时,需要分2种情况来讲:5前为奇数时,舍5入1;5前为偶数,舍5不进(0是偶数)。

方案其它——用成熟的库

  • Math.js (广泛的数学库)
  • decimal.js (十进制类型的任意精度数值)
  • big.js (任意精度的大数运算——适用于需要高精度计算的场景:金融、密码学、科学计算和大数据处理等)

http://www.ppmy.cn/ops/154459.html

相关文章

Android 启动流程

一 Bootloader 阶段 在嵌入式系统中&#xff0c;Bootloader的引导过程与传统的PC环境有所不同&#xff0c;主要是因为嵌入式系统的硬件配置和应用场景更加多样化。以下是嵌入式系统中Bootloader被引导的一般流程&#xff1a; 1. 硬件复位 当嵌入式设备上电或复位时&#xff…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.26 统计圣殿:从描述统计到推断检验

1.26 统计圣殿&#xff1a;从描述统计到推断检验 目录 #mermaid-svg-3nz11PRr47fVfGWZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3nz11PRr47fVfGWZ .error-icon{fill:#552222;}#mermaid-svg-3nz11PRr47fVfGWZ…

基于python对抖音热门视频的数据分析与实现

1.1 研究背景 随着互联网技术的飞速发展&#xff0c;短视频平台已经成为人们日常生活中不可或缺的一部分。抖音作为其中的佼佼者&#xff0c;凭借其简洁的操作界面、丰富的视频内容和高效的推荐算法&#xff0c;吸引了大量用户。截至2022年底&#xff0c;抖音日活跃用户数已超…

国产碳化硅(SiC)MOSFET模块在电镀电源中全面取代进口IGBT模块

国产碳化硅&#xff08;SiC&#xff09;MOSFET模块在电镀电源中全面取代进口IGBT模块&#xff0c;倾佳电子杨茜分析以下几方面的技术、经济和政策优势&#xff1a; 倾佳电子杨茜致力于推动SiC碳化硅模块在电力电子应用中全面取代IGBT模块&#xff0c;助力电力电子行业自主可控…

HTML-新浪新闻-实现标题-样式1

用css进行样式控制 css引入方式&#xff1a; --行内样式&#xff1a;写在标签的style属性中&#xff08;不推荐&#xff09; --内嵌样式&#xff1a;写在style标签中&#xff08;可以写在页面任何位置&#xff0c;但通常约定写在head标签中&#xff09; --外联样式&#xf…

C# 与.NET 日志变革:JSON 让程序“开口说清话”

一、引言&#xff1a;日志新时代的开启 在软件开发的漫长旅程中&#xff0c;日志一直是我们不可或缺的伙伴。它就像是应用程序的 “黑匣子”&#xff0c;默默地记录着程序运行过程中的点点滴滴&#xff0c;为我们在调试、排查问题以及性能优化时提供关键线索。在早期&#xff…

Manticore Search,新一代搜索引擎之王

吊打ES&#xff0c;新一代搜索引擎之王 概述 Manticore Search 是一个开源的分布式搜索引擎&#xff0c;专注于高性能和低延迟的搜索场景。 它基于 Sphinx 搜索引擎开发&#xff0c;继承了 Sphinx 的高效索引和查询能力&#xff0c;并在分布式架构、实时搜索、易用性等方面进…