在JS中,0.1+0.2 !== 0.3
console.log(0.1+0.2 === 0.3); // false
console.log(0.1+0.2); // 0.30000000000000004
原因:浮点数运算的精度所致,属于算术误差
计算机只认识二进制,运算时需将其他进制的数值转为二进制再进行计算。而浮点数用二进制表达是无穷的:
//0.1:十进制——>二进制
console.log(0.1.toString(2));//0.0001100110011001100110011001100110011001100110011001101
//0.2:十进制——>二进制
console.log(0.2.toString(2));//0.001100110011001100110011001100110011001100110011001101
IEEE 754标准的64位双精度浮点数的小数部分最多支持53位二进制位,所以两者相加后,因浮点数0.1的小数位的限制而截取的二进制数字,此时误差产生;再转为十进制,结果为 0.30000000000000004。
二进制能精确地表示位数有限且分母是2的倍数的小数。
解决
- 将浮点数化为整数计算:将浮点数乘以10的N次方,再除以10的N次方。
- 使用第三方库,如Math.js、big.js等