JavaScript 损失精度的问题和解决方案

(不因幸运而固步自封,不因厄运而一蹶不振。真正的强者,善于从顺境中找到阴影,从逆境中找到光亮,时时校准自我前进的目标。——易卜生)

在这里插入图片描述

JavaScript损失精度

比如0.1+0.2应等于0.3,但实际上却等不是如此
在这里插入图片描述
这是因为在实际的运算过程中,js会把0.1+0.2当作二进制来运算,所以实际上是这样的。

// 0.10.2 都转化成二进制后再进行运算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

// 转成十进制正好是 0.30000000000000004

那么为了解决损失精度的问题,我们可以先转换成整数再进行运算

/**
 * 精确加法
 */
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;
}

也可以使用第三方库,比如Math.js或者Bignumber.js等。他们内部的实现原理也是将小数先转换成拆分两个字符串,然后计算小数部分的字符串的长度,然后利用这个长度将小数变成整数。

猜你喜欢

转载自blog.csdn.net/qq_42427109/article/details/130618596
今日推荐