在javascript中整数和浮点数都属于Number数据类型(简单数据类型中的一种),咱们常常会发如今打印1.0
这样的浮点数的结果是1
而非1.0
,这是因为保存浮点数的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数转换为整数。
上面这种状况虽然让强迫症患者有点不舒服,可是好歹也不是什么大错,接下来这种状况就很吓人了。例如咱们在计算0.1
加0.2
时,它的输出结果不是0.3
,而是0.3000000000000004
。what the fuck?!第一次遇到这种状况的童鞋有没有感受到世界观受到了挑战?javascript
因而赶快翻书来拯救本身的灵魂以及肉体,发现书中赫然写着:ECMAScrip是基于IEEE754数值浮点计算若是不知道IEEE754是什么就点我吧,这种数值计算方法会将数值保存为二进制而后进行计算,因为浮点数用二进制表达时是无穷的,因此在进行算术计算时会产生舍入偏差,因为舍入偏差的存在,浮点数计算的精确度远远不如整数计算,最后记住了永远不要测试某个特定浮点数的数值。
因此杨绛先生说的对,年轻人就是想的多读书少,没文化老是动不动就会怀疑人生,因此仍是要多读书啊!!!java
所谓对症下药,知道了问题产生的缘由那么就能够找到问题的解决方案啦。既然是因为浮点数的二进制为无穷数产生的偏差,这种偏差在整数运算中不会存在,聪明的你是否是窥破真相了呢?没错,那就是在运算工程中将浮点数转换为整数,再将得出的结果转换为浮点数。客官,下面是新鲜上的代码~测试
//加法 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数}; //参数1小数点后的位数 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数 m=Math.pow(10,Math.max(r1,r2)); //取其中较大的位数 return (arg1*m+arg2*m)/m; //先将arg1和arg2转换为整数进行计算,而后再转换回浮点数 }
done,科科~url