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