Javascript的计算精度问题,这个一不注意就容易对我们的项目产生或大或小的影响。所以我们需要了解下Javascript计算精度问题产生的原因 及一些解决办法。
产生的原因
接下来我们看一个列子:
看到这里,是不是有点和我们想的不一样。这应该是相等,但为什么不相等呢?
原来,在Javascript中 0.1 + 0.2 == 0.30000000000000004,这就是因为 Javascript的计算精度 而引起。 因为在计算 0.1+0.2 时,因为计算机能读懂的是二进制,所以计算机会将0.1和0.2转化为二进制。
解决方法
数据展示类
当我们拿到类似于0.30000000000000004这样的数据时,可以使用 toPrecision() 方法凑整后用 parseFloat() 方法转化为数字后再显示。
console.log(parseFloat((0.1 + 0.2).toPrecision(12)) === 0.3); // true可以将其封装成一个方法:
function strip(num,precision = 12) { return parseFloat(num,toPrecision(precision)) }对于选用12作为默认精度,是因为能解决掉大部分的0001和0009这样的问题,大部分情况下够用了,当然也可以 传入想要的精度。
数据运算类
对于运算类操作,如 +-*/ ,就不能使用 toPrecision 了。可以把小数转化为整数后再运算。如加法:
function add(num1,num2){ const num1Digits = (num1.toString().split(".")[1] || "").length; const num2Digits = (num2.toString().split(".")[1] || "").length; const baseNum = Math.pow(10,Math.max(num1Digits,num2Digits)); return (num1 * baseNum + num2 * baseNum) / baseNum; }以上方法能适用大部分场景。也有局限性,如果遇到科学计数法:2.3e+1 时还需要做处理。