首页 > 其他分享 >前端计算数字精度丢失问题解决方法记录 | 京东云技术团队

前端计算数字精度丢失问题解决方法记录 | 京东云技术团队

时间:2023-11-08 12:03:06浏览次数:30  
标签:num1 num2 num3 前端 number 丢失 NP 京东 精度

在日常一些需求中,总会遇到一些需要前端进行手动计算的场景,那么这里需要优先考虑的则是数字精度问题!具体请看下面截图

前端计算数字精度丢失问题解决方法记录 | 京东云技术团队_双精度

如图所示,在JavaScript进行浮点型数据计算当中,会出现计算结果“不正确”的现象。

我们知道浮点型数据类型主要有:单精度float、双精度double。

浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是因为这样就被定义成浮点型了。(不得不佩服这文化程度,定义个数据名称都这么有深度~)

但是!!!

JavaScript 存储小数和其它语言如 Java 和 Python 都不同,JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型 它的实现遵循 IEEE 754 标准,IEEE 754 标准的内容都有什么,这个咱不用管,我们只需要记住以下一点:

javascript以64位双精度浮点数存储所有Number类型值,即计算机最多存储64位二进制数。

对于double型数据(双精度浮点数),其长度是8个字节(大小),右边52位用来表示小数点后面的数字,中间11位表示e(exponent)小数点移动的位数,左边一位用来表示正负。如图所示:

前端计算数字精度丢失问题解决方法记录 | 京东云技术团队_解决方案_02

只要知道了这一点,那我们就可以对症下药(解决问题):

解决方案 ①

Number(parseFloat(20.24*100).toPrecision(16))

存储二进制时小数点的偏移量最大为52位,最多可表示的十进制为9007199254740992,对应科学计数尾数是 9.007199254740992,这也是 JavaScript 最多能表示的精度。它的长度是 16,所以可以使用 toPrecision(16) 来做精度运算。

通过先转为浮点型计算,然后做精度运算后再转为Number类型即可。

解决方案 ②

通过引入number-precision进行计算,步骤如下:

  • Install
npm install number-precision --save
  • Methods
NP.strip(num)         // strip a number to nearest right number
NP.plus(num1, num2, num3, ...)   // addition, num + num2 + num3, two numbers is required at least.
NP.minus(num1, num2, num3, ...)  // subtraction, num1 - num2 - num3
NP.times(num1, num2, num3, ...)  // multiplication, num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // division, num1 / num2 / num3
NP.round(num, ratio)  // round a number based on ratio
  • Usage
import NP from 'number-precision'
NP.strip(0.09999999999999998); // = 0.1
NP.plus(0.1, 0.2);             // = 0.3, not 0.30000000000000004
NP.minus(1.0, 0.9);            // = 0.1, not 0.09999999999999998
NP.times(3, 0.3);              // = 0.9, not 0.8999999999999999
NP.divide(1.21, 1.1);          // = 1.1, not 1.0999999999999999
NP.round(0.105, 2);            // = 0.11, not 0.1

更多解决方案敬请关注后续更新,希望对您有帮助~

作者:京东零售 黄宏峰

来源:京东云开发者社区 转载请注明来源

标签:num1,num2,num3,前端,number,丢失,NP,京东,精度
From: https://blog.51cto.com/u_15714439/8247873

相关文章

  • 前端如何防止数据被异常篡改并且复原数据
    每天,我们都在和各种文档打交道,PRD、技术方案、个人笔记等等等。其实文档排版有很多学问,就像我,对排版有强迫症,见不得英文与中文之间不加空格。所以,最近在做这么一个谷歌扩展插件chrome-extension-text-formatting,通过谷歌扩展,快速将选中文本,格式化为符合中文文案排版指北的文......
  • 微前端实战
    微前端实战什么是微前端微前端是指存在于浏览器中的微服务,其借鉴了微服务的架构理念,将微服务的概念扩展到了前端。如果对微服务的概念比较陌生的话,可以简单的理解为微前端就是将一个大型的前端应用拆分成多个模块,每个微前端模块可以由不同的团队进行管理,并可以自主选择框架,并且......
  • 一键生成前端UI,公司90%项目UI都靠它搞定
    今天看公众号,有大神分析了这样的一篇文章:一键生成前端UI,公司90%项目UI都靠它搞定地址:https://mp.weixin.qq.com/s/UhmLwVeZ0jwZORur8XD2MQ ......
  • 前端实现Excel导出【xlsx】【xlsx-js-style】
    最终效果场景有的时候我们需要根据服务端返回的数据来导出excel表格优化一:设置单元格样式比如:可以调节背景色、字体样式、borderxlsx基础库不提供样式设置,可以使用xlsx-js-style库,这个库是xlsx库的fork版本,并添加了样式定义详细样式可以查看https://github.com/gitbrent/xl......
  • 前端常用设计模式
    什么是设计模式?​设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,设计模式并不是一种固定的公式,而是一种思想,是一种解决问题的思路;使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可维护性。设计模式不区分编......
  • 前端性能优化有哪些?
    前端有哪些性能优化?前端性能优化分两部分1、加载性能优化2、渲染性能优化一、加载性能优化本质: •1、减少请求次数; •2、减少请求资源的大小; •3、网络优化;1、减少请求次数方式   1)图片资源 ○CSS雪碧图:把一些常用、重复使用的小图合并成一张大图 ......
  • Day02-Java开发所需的前端技术
    HTML常见元素1.文本元素Heading:不同字号标题,从1-6,数字越大字号越小。<!--标题元素--><h1>1号标题</h1><h2>2号标题</h2><h3>3号标题</h3><h4>4号标题</h4><h5>5号标题</h5><h6>6号标题</h6>Paragrap......
  • 完蛋!我被 Out of Memory 包围了! | 京东云技术团队
    是极致魅惑、洒脱自由的Javaheapspace?是知性柔情、温婉大气的GCoverheadlimitexceeded?是纯真无邪、活泼可爱的Metaspace?如果以上不是你的菜,那还有……刁蛮任性,无迹可寻的CodeCache!性感火辣、心思细腻的DirectMemory高贵冷艳,独爱你一人的OOMKiller!总有一款,能让你钟情!BUG选择......
  • 一个java文件的JVM之旅 | 京东物流技术团队
    准备我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(JavaVirtualMachine)这个地方旅行。变身我高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?JVM不能直接加载java文件的原因:Java源代码中包含了许多......
  • 体验问题哪里找?点击链接获取答案~ | 京东云技术团队
    用户体验(UserExperience,简称UX)是指用户在与产品、系统或服务进行交互的过程中所产生的主观感受和情感反应。它涵盖了用户对产品或服务的使用过程中所体验到的方方面面,包括界面设计、交互流程、功能性、易用性、可靠性、响应速度、视觉美感等。我们为什么需要注重“用户体验”呢?引......