未加星标

javascript浮点值运算bug

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
问题

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; if() 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,科科~

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

分页:12
转载请注明
本文标题:javascript浮点值运算bug
本站链接:http://www.codesec.net/view/484704.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(23)