前端计算数字精度丢失问题解决方法记录 | 京东云技术团队
在日常一些需求中,总会遇到一些需要前端进行手动计算的场景,那么这里需要优先考虑的则是数字精度问题!具体请看下面截图
如图所示,在JavaScript进行浮点型数据计算当中,会出现计算结果“不正确”的现象。
我们知道浮点型数据类型主要有:单精度float、双精度double。
浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是因为这样就被定义成浮点型了。(不得不佩服这文化程度,定义个数据名称都这么有深度~)
但是!!!
JavaScript 存储小数和其它语言如 Java 和 Python 都不同,JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型 它的实现遵循 IEEE 754 标准,IEEE 754 标准的内容都有什么,这个咱不用管,我们只需要记住以下一点:
javascript以64位双精度浮点数存储所有Number类型值,即计算机最多存储64位二进制数。
对于double型数据(双精度浮点数),其长度是8个字节(大小),右边52位用来表示小数点后面的数字,中间11位表示e(exponent)小数点移动的位数,左边一位用来表示正负。如图所示:
只要知道了这一点,那我们就可以对症下药(解决问题):
解决方案 ①
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
更多解决方案敬请关注后续更新,希望对您有帮助~
作者:京东零售 黄宏峰
来源:京东云开发者社区 转载请注明来源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
文生图大型实践:揭秘百度搜索AIGC绘画工具的背后故事!
作者 | Tianbao 导读 2023年以来,AIGC技术已催生了新一轮人工智能浪潮。AI绘画作为大模型最引人瞩目的应用领域之一,近年来也取得了重大突破。AI绘画系统可以根据用户的输入或提示生成各种风格的图像,这为艺术家、设计师和创作者提供了强大的工具,也为数字创意领域带来了新的可能性。 近日,百度搜索主任架构师Tianbao应邀参加了知名技术媒体InfoQ的“极客有约”对话节目,与主持人和观众们就图像生成技术进行了深入探讨,包括百度搜索的应用场景、相关技术的思考,以及在搜索业务场景的应用落地经验。 本文详细记录了访谈内容。 全文10034字,预计阅读时间26分钟。 亮点: 1、这是一个巨大的变革,从过去用户在全网寻找图像,转变为结合了查找图像和生成图像两种方式,以满足用户更具体的需求,这也在一定程度上鼓励用户更主动地表达他们真正的需求。 2、要使一个模型更好地理解中文,准备和清理与中文语义相关的语料非常重要。 3、对于去除低质量样本和构建高价值样本,都是图文对齐所必需的能力。 4、百度搜索需要满足用户在内容和风格方面多样化的需求,在百度搜索目前支持了上千种不同的画面风格定义。 5、...
- 下一篇
Xmake v2.8.5 发布,支持链接排序和单元测试
Xmake是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。 我们能够使用它像 Make/Ninja 那样可以直接编译项目,也可以像 CMake/Meson 那样生成工程文件,另外它还有内置的包管理系统来帮助用户解决 C/C++ 依赖库的集成使用问题。 目前,Xmake 主要用于 C/C++ 项目的构建,但是同时也支持其他 native 语言的构建,可以实现跟 C/C++ 进行混合编译,同时编译速度也是非常的快,可以跟 Ninja 持平。 Xmake = Build backend + Project Generator + Package Manager + [Remote|Distributed] Build + Cache 尽管不是很准确,但我们还是可以把 Xmake 按下面的方式来理解: Xmake ≈ Make/...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度