javascript精度丢失

1,102 阅读1分钟

javascript精度丢失

0.1 + 0.2 === 0.30000000000000004 的问题

此计算涉及到 进制转换对阶运算 (具体不细说了), 结论就是: 精度损失可能出现在进制转化和对阶运算过程中

如何解决:

1. 将数字转成整数。

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;
}

或者:

console.log(+(0.1 + 0.2).toFixed(1)) // 0.3
// toFixed() 也可以直接使用,不过要注意 toFixed() 后会转变成字符串类型。

可以应付基本的计算问题了。如果是比较复杂的算法,推荐以下第三方库。

2. lodash 点击进入

3. Math.js

此库比较大,单纯的一个计算引入一个库,得不偿失。

扩展:进制转换

  • 核心函数
    • Number.toString(radix);
    • parseInt(str,radix)
  1. Number.toString(radix). 返回表示该数字的指定进制形式的字符串
let num = 10
console.log(num.toString(2)) // '1010'
  1. parseInt(str,radix). 将字符串str按照radix进制编码方式转换为10进制返回,没有radix,默认为10;
console.log(parseInt('1010', 2)); // 10
console.log(parseInt('23', 8)); // 19