• 技术文章 >web前端 >js教程

    javascript浮点值运算bug

    小葫芦小葫芦2016-10-20 17:53:58原创549

    问题

    在javascript中整数和浮点数都属于Number数据类型(简单数据类型中的一种),我们经常会发现在打印1.0这样的浮点数的结果是1而非1.0,这是由于保存浮点数的内存空间是保存整数值的两倍,所以ECMAScript会不失时机地将浮点数转换为整数。
    上面这种情况虽然让强迫症患者有点不舒服,但是好歹也不是什么大错,接下来这种情况就很吓人了。例如我们在计算0.1加0.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转换为整数进行计算,然后再转换回浮点数
      }
    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:javascript
    上一篇:JavaScript 异步编程之 jsdeferred 原理解析 下一篇:自定义右键菜单
    线上培训班

    相关文章推荐

    • 浅析Node.js+Winston库如何构建简单日志功能• javascript怎么实现句子反转• 浅谈Angular父子组件间怎么进行通信• JavaScript怎么实现定时关闭div• Javascript怎么设置水印叠堆

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网