原因
因为JS采用IEEE754 双精度版本(64位),并且只要采用该IEEE754的语言都有该问题。
浮点数转成二进制时丢失了精度,因此在二进制计算完再转回十进制时可能会和理论结果不同
解决办法
1.乘以10的幂次方转成整数
(0.1 * 10 + 0.2 * 10) / 10 // 0.3
封装成一个函数
const mathFloat = (n1, n2) => {
let r1, r2, m
try {
r1 = n1.toString().split('.')[1].length // 获取小数点后边长度
} catch(error) {
r1 = 0
}
try {
r2 = n2.toString().split('.')[1].length // 获取小数点后边长度
} catch(error) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2)) // 获取最多小数位的长度
return (n1 * m + n2 * m) / m
}