前端计算数字精度丢失问题解决方法记录 | 京东云技术团队
在日常一些需求中,总会遇到一些需要前端进行手动计算的场景,那么这里需要优先考虑的则是数字精度问题!具体请看下面截图
如图所示,在 JavaScript 进行浮点型数据计算当中,会出现计算结果“不正确”的现象。
我们知道浮点型数据类型主要有:单精度 float、双精度 double。
浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是因为这样就被定义成浮点型了。(不得不佩服这文化程度,定义个数据名称都这么有深度~)
但是!!!
JavaScript 存储小数和其它语言如 Java 和 Python 都不同,JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number 类型 它的实现遵循 IEEE 754 标准,IEEE 754 标准的内容都有什么,这个咱不用管,我们只需要记住以下一点:
javascript 以 64 位双精度浮点数存储所有 Number 类型值,即计算机最多存储 64 位二进制数。
对于 double 型数据(双精度浮点数),其长度是 8 个字节(大小),右边 52 位用来表示小数点后面的数字,中间 11 位表示 e(exponent)小数点移动的位数,左边一位用来表示正负。如图所示:
只要知道了这一点,那我们就可以对症下药(解决问题):
解决方案 ①
存储二进制时小数点的偏移量最大为 52 位,最多可表示的十进制为 9007199254740992,对应科学计数尾数是 9.007199254740992,这也是 JavaScript 最多能表示的精度。它的长度是 16,所以可以使用 toPrecision(16) 来做精度运算。
通过先转为浮点型计算,然后做精度运算后再转为 Number 类型即可。
解决方案 ②
通过引入number-precision
进行计算,步骤如下:
Install
Methods
Usage
更多解决方案敬请关注后续更新,希望对您有帮助~
作者:京东零售 黄宏峰
来源:京东云开发者社区 转载请注明来源
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/e5561a3558b1012d8abb6fe99】。文章转载请联系作者。
评论