问题:
1 | congsole.log(0.1 + 0.2); // 0.30000000000000004 |
看到没有,不是0.3 不是0.3 不是0.3 …
解决:
1 | var n = 0.1 + 0.2; |
虽然得到了想要的结果,但这还会有较大的误差,因为numObj.toFixed([digits])
使用的是四舍五入。
可以定义这么个函数:
1 | function formatFloat(f, digit) { |
这个函数的巧妙之处在于,比如:
1 | // 求 0.1 + 0.2,精确到2位小数 |
总结: 之所以产生精度问题,并不是只有js中存在,应该是所有编程语言都会有这个问题,原因在于我们进行数学运算时习惯使用10进制,而计算机要把10进制转换成二进制进行运算,在这个转换过程中便产生了精度问题。
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
两个无限循环小数相加,我也不知道怎么算 233 …
关于js中float精度问题,曾在一次刁钻的笔试中遇到过,题目貌似就是让写出console.log(0.1 + 0.2)
的结果,当时是不明所以(最后笔试也是通过了的233);这次是在项目中,碰到了这个问题,一番查找弄明白了怎么回事儿,记录下来避免二次踩坑!