0.1 + 0.2 !== 0.3

156 阅读1分钟

原因

因为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
}

2.引入第三方库

Math.js
big.js