如何解决0.1+0.2不等于0.3的问题

为何会出现此问题?

总结一句话:这是因为二进制模拟十进制进行运算时的精度问题。

具体可查看 0.1 + 0.2 不等于 0.3?为什么 JavaScript 有这种“骚”操作? 这篇掘金文章。

如何解决

Number.EPSILON

第一种方法是利用 Number.EPSILON ,这个值无限接近于 0。0.1+0.2 的精度误差在这个值的范围内:

1
2
3
4
5
function numbersEqual(a,b){
return Math.abs(a-b)<Number.EPSILON;
}
var a=0.1+0.2, b=0.3;
console.log(numbersEqual(a,b)); //true

内置函数 toFixed

利用 parseFloat + 内置函数 toFixed:

1
2
3
4
5
6
function formatNum(num, fixed = 10) {
// a.toFixed(fixed) 先转为小数点10位的字符串 "0.3000000000"
return parseFloat(a.toFixed(fixed)); // 然后通过parseFloat转为浮点数
}
var a = 0.1 + 0.2;
console.log(formatNum(a)); //0.3

内置函数 toPrecision

我平常用此函数来计算精度,具体可参考 Number.prototype.toPrecision() | MDN

1
2
3
// 内置函数toPrecision(中文:精确,精度)
// 参数是精度.比如5.1234,传2返回5.1,传1返回5;0.2+0.1传2返回0.30
(0.1 + 0.2).toPrecision(10) == 0.3; // true