浮点数精度失准

js中进行数字计算时候,会出现精度误差的问题。先来看一个实例:

console.log(0.1+0.2===0.3);//false

console.log(0.1+0.1===0.2);//true

上面第一个的输出会超出我们的常识,正常应该为true,这里为什么会是false呢,直接运行会发现0.1+0.2在js中计算的结果是:

console.log(0.1+0.2);//输出0.30000000000000004

浮点数产生的原因

我们首先就想到计算机能读懂的是二进制,所以我们进行运算的时候,实际上是把数字转换为了二进制进行的,所以我们把0.1和0.2转换为二进制:

0.1 => 0.0001 1001 1001 1001..(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)

这里可以看出转换为二进制是一个无限循环的数字,单在计算机中对于无限循环的数字会进行舍入处理的,进行双精度浮点数的小数部分最多支持52位。然后把两个2进制的数进行运算得出的也是一个二进制数值,最后再把它转换为十进制。保留17位小数,所以0.1+0.2的值就成了 0.30000000000000004。 0.1+0.1的值成了0.20000000000000000,全是0的时候可以省略,就成了0.2

解决浮点数精度误差的办法

export function strip(num, precision = 12) {
    if (!num) {
        return 0;
    }
    return +parseFloat(parseFloat(num).toPrecision(precision));
}
posted @ 2020-09-08 10:37  守候岩  阅读(213)  评论(0编辑  收藏  举报