当计算机在计算小数位的加减乘除的时候会出现精度丢失的现象,如下:
// 加法
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
网友评论