javascript浮点值运算舍入偏差

题目

在javascript中整数和浮点数都属于Number数据类型(简朴数据类型中的一种),我们常常会发如今打印1.0如许的浮点数的效果是1而非1.0,这是因为保留浮点数的内存空间是保留整数值的两倍,所以ECMAScript会不失时机地将浮点数转换为整数。
上面这类状况虽然让强迫症患者有点不舒服,然则好歹也不是什么大错,接下来这类状况就很吓人了。比方我们在盘算0.10.2时,它的输出效果不是0.3,而是0.3000000000000004。what the fuck?!第一次碰到这类状况的童鞋有无感觉到世界观受到了应战?

发生缘由

因而连忙翻书来挽救本身的魂魄以及肉体,发明书中赫然写着:ECMAScrip是基于IEEE754数值浮点盘算假如不知道IEEE754是什么就点我吧,这类数值盘算方法会将数值保留为二进制然后举行盘算,因为浮点数用二进制表达时是无限的,所以在举行算术盘算时会发生舍入偏差,因为舍入偏差的存在,浮点数盘算的精确度远远不如整数盘算,末了记住了永久不要测试某个特定浮点数的数值
所以杨绛教师说的对,年轻人就是想的多读书少,没文化老是动不动就会疑心人生,所以照样要多读书啊!!!

解决方案

所谓对症下药,知道了题目发生的缘由那末就能够找到题目的解决方案啦。既然是因为浮点数的二进制为无限数发生的偏差,这类偏差在整数运算中不会存在,智慧的你是否是窥破原形了呢?没错,那就是在运算工程中将浮点数转换为整数,再将得出的效果转换为浮点数。客长,下面是新颖上的代码~

//加法  
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,科科~

    原文作者:sushi
    原文地址: https://segmentfault.com/a/1190000007207259
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞