解答
一、问题引入
console.log(0.1+0.1) //0.2
console.log(0.1+0.2) //0.30000000000000004(精度最高保留到17位)
因为像 0.1+0.2这样的操作对于计算机来说转换为二进制之后将是两个无限循环的数。
而对于计算机而言是不允许有无限的,进行四舍五入之后双精度浮点数保留52位
结果为0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100
转为十进制就是0.30000000000000004
二、基本解决方法
【1】利用toFixed(digits)
toFixed函数在digits参数存在的情况下返回一个所给数值的定点数表示法的字符串(digits要在0-20之间,默认为0)。
我们可以利用该函数限定返回数值的位数,从而达到提高精度的效果。
【2】重写toFixed函数
思路为放大原有的数据,利用整数的整除来避免精度丢失
【3】基础运算自实现
在js底层中,,每个变量是以二进制表示,0.1和0.2转化为二进制的时候是无限循环小数,所以js就会进行截取,截取之后0.1和0.2就不是它们本身了,比原来大那么一点,所以0.1+0.2>0.3.
解决方法:先给他们放大倍数,随后除以相应倍数。
所有的程序语言都无法计算精确么
所有的程序语言都无法计算精确么
弱类型语言,数据类型不严格,typescript然后就解决了这个问题啦
原因:JS是弱类型语言,数据类型并不严格。
解决方案:按小数位数乘上相应的10的幂次方,提升为整数再相加,运算结束后再将小数降下