JavaScript 浮点数计算精度丢失问题

当计算机在计算小数位的加减乘除的时候会出现精度丢失的现象,如下:

    // 加法
    0.1 + 0.2 = 0.30000000000000004

    // 减法
    1.5 - 1.2 = 0.30000000000000004

    // 乘法
    0.8 * 3 = 2.4000000000000004

    // 除法
    0.3 / 0.1 = 2.9999999999999996

原因:这是由于在计算机的角度计算的是二进制而不是十进制,所以在计算的时候先将十进制转换成二进制,而在转换中部分的十进制的浮点数会变成二进制的无限不循环小数,而计算机在可以支持浮点数的小数部分到52位,然后再转换成十进制进行加减乘除的运算,这样得到的计算结果便不在准确了。

部分十进制转二进制
    0.1=====>0.0001 1001 1001 1001 ...

    0.2=====>0.0100 1100 1100 1100 ...

    0.4=====>0.0110 0110 0110 0110 ...

    0.5=====>0.1

    0.6=====>0.1001 1001 1001 1001 ...

解决方案 - Math.js

对于任意精度的计算,math.js 支持BigNumber 数据类型。
安装 npm install mathjs 或者使用cdn

注意事项:请注意,在 TypeScript 项目中使用 mathjs 时,您还必须安装类型定义文件:npm install @types/mathjs

使用:

let add = math.number(math.add(math.bignumber(0.1), math.bignumber(0.2)))
console.log(add); //0.3

你可能感兴趣的:(JavaScript 浮点数计算精度丢失问题)