javascript中如何解决精度丢失问题
在项目开发中,你一定遇到过精度丢失的问题!比如某个无良的后端返回了一个超16位的数字订单号,比如0.1+0.2 != 0.3等等:

01
精度丢失的原因
是什么原因造成的捏?
嗯〜大道理咱也不会说,问就是一句话回复:
在十进制转二进制的过程中,因js存储位数有限制,末位就会0舍1入取近似值,从而导致再转回十进制时产生误差。
02
如何解决
使用toPrecision;
乘以10的N次幂转换成整数,再除以N次幂转回小数;
先加上1e-14或Number.EPSILON再取值;
使用第三方库,处理大数的 bignumber.js,处理小数的number-precision 和 decimal.js,处理JSON序列化json-bigint。
使用toPrecision
这个方法主要用于纯展示。先用toPrecision保留一定位数的经度,再通过parseFloat展示。
例如:
这个12是精度默认值或者说是一个经验值,12位一般都能解决0000...1和0000...9的问题。一般不适合浮点数的运算。
先转整数进行运算,再转成小数
这种方式是我之前浮点运算时经常用到的方法。我们拿0.1+0.2的运算来举例:
但这种方法也不是万能的,有时候也会失精:
真是防不胜防啊!这时候我们也可以使用Math.round()方法来达到我们的目的,如下:
先加上1e-14或Number.EPSILON再取值
给浮点数加上一个极小的数就可以达到目的。获取极小的数有两种方式:
1e-14(10的-14次方)
ES6的极小的常量Number.EPSILON
先来看看Number.EPSILON是什么?
这两种方式都可以,看自己的喜好啦!
第三方库
第三方库主要介绍以下四种:
bignumber.js的使用-处理大数
安装:
引入:
使用:
官网:https://mikemcl.github.io/bignumber.js/
number-precision的使用-处理小数
安装:
引入:
使用:
number-precision的使用-处理小数
安装:
引入:
使用:
上面的结果是Decimal 对象,取值需要Number 或 String转换
官网:http://mikemcl.github.io/decimal.js/
json-bigint的使用-处理后端的返回值
安装:
引入:
使用:
主要是把大数据转成字符串。其实关于这一点,如果后端经验丰富的话,自然会给前端返回字符串,也无需前端转换。不过呢,可能前端的技能的提升也就是从无经验的后端开始的噢!