跳转至

JavaScript 数字精度问题解决方案

JavaScript 在进行浮点数运算时经常会出现精度问题,例如 0.1 + 0.2 !== 0.3。本文介绍了一种解决浮点数精度问题的方法。

解决思路

以最大精度为标准同化精度再计算。即将参与运算的数字转换为整数进行计算,然后再转换回小数。

代码实现

/**
 * 精确加法计算
 * @param {number} num1 - 第一个加数
 * @param {number} num2 - 第二个加数
 * @returns {number} 计算结果
 */
function addNum(num1, num2) {
  let sq1, sq2, m;

  try {
    sq1 = num1.toString().split(".")[1].length;
  } catch (e) {
    sq1 = 0;
  }

  try {
    sq2 = num2.toString().split(".")[1].length;
  } catch (e) {
    sq2 = 0;
  }

  m = Math.pow(10, Math.max(sq1, sq2));

  return (num1 * m + num2 * m) / m;
}

使用示例

console.log(addNum(0.1, 0.2)); // 输出: 0.3
console.log(addNum(0.15, 0.25)); // 输出: 0.4
console.log(addNum(1.23, 4.567)); // 输出: 5.797

其他精度处理方法

除了上述方法外,还有其他处理浮点数精度问题的方案:

  1. 使用 toFixed() 方法:

    (0.1 + 0.2).toFixed(2); // 返回字符串 "0.30"
    parseFloat((0.1 + 0.2).toFixed(10)); // 返回数字 0.3
    

  2. 使用第三方库:如 decimal.js、big.js 等专门处理高精度运算的库

注意事项

  1. 该方法只处理了加法运算,如需处理其他运算(减、乘、除),可参考类似的思路
  2. 对于需要更高精度的计算场景,建议使用专门的数学计算库
  3. 在金融等对精度要求极高的场景中,应格外注意浮点数运算的准确性