本文介绍了解决 JS 中小数运算出现误差的两种解决办法

问题

在 JS 的小数运算中可能会出现一些问题,比如说下面两种情况:

  • 0.1 + 0.2 加法出现精度偏差问题
  • 0.14 * 100 乘法出现精度偏差问题

解决方案

下面简单介绍了两种常用的解决方案:

限制精确位数

可以限制保留几位小数的方式来避免误差:

1
2
// 保留两位小数
const num = (0.1 + 0.2).toFixed(2);

先将小数转化为整数,运算之后再重新转化为小数

限制保留小数位数的方式不一定适用于所有场景,有些时候我们必须要根据不同的小数位数来进行计算。那么我们就可以使用下面这种方式。

定义一个方法,用来对小数进行加法运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 用来进行小数相加的工具方法
* @param {*} num1
* @param {*} num2
*/
addNum (num1, num2) {
let sq1, sq2, multiple;
try {
sq1 = num1.toString().split(".")[1].length;
}
catch (e) {
sq1 = 0;
}
try {
sq2 = num2.toString().split(".")[1].length;
}
catch (e) {
sq2 = 0;
}
multiple = Math.pow(10, Math.max(sq1, sq2) + 1);
return (num1 * multiple + num2 * multiple) / multiple;
}

使用上面的方法进行小数相加

1
const num = addNum(0.1 + 0.2);


总结

  • 第一种方法简单,方便,易于操作;

  • 第二种方法基本可以使用所有小数相加的场景。(如果是其他的运算,修改运算符号,也可以正常使用)