js浮点数值计算
2015-08-07 00:00
826 查看
摘要: js浮点数值计算
引:alert(0.1 + 0.2 == 0.3); // false
分析:浮点数值在js里存储的最高精度为17位小数,所以0.1+0.2=0.30000000000000004而不是0.3,实际上所有基于IEEE754的浮点计算都会存在误差,ECMAScript并非独此一家。
解决:将js的浮点计算转换为整型数值计算,如上可以用 (0.1*10 + 0.2*10)/10 = 0.3 来表示。
具体实现如下:
引:alert(0.1 + 0.2 == 0.3); // false
分析:浮点数值在js里存储的最高精度为17位小数,所以0.1+0.2=0.30000000000000004而不是0.3,实际上所有基于IEEE754的浮点计算都会存在误差,ECMAScript并非独此一家。
解决:将js的浮点计算转换为整型数值计算,如上可以用 (0.1*10 + 0.2*10)/10 = 0.3 来表示。
具体实现如下:
<script type="text/javascript"> // 两个浮点数求和 function accAdd(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); return Math.round(num1*m+num2*m)/m; } // 两个浮点数相减 function accSub(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); n=(r1>=r2)?r1:r2; return (Math.round(num1*m-num2*m)/m).toFixed(n); } // 两数相除 function accDiv(num1,num2){ var t1,t2,r1,r2; try{ t1 = num1.toString().split('.')[1].length; }catch(e){ t1 = 0; } try{ t2=num2.toString().split(".")[1].length; }catch(e){ t2=0; } r1=Number(num1.toString().replace(".","")); r2=Number(num2.toString().replace(".","")); return (r1/r2)*Math.pow(10,t2-t1); } //乘法 function accMul(num1,num2){ var m=0,s1=num1.toString(),s2=num2.toString(); try{m+=s1.split(".")[1].length}catch(e){}; try{m+=s2.split(".")[1].length}catch(e){}; return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); } //给Number对象的原型增加方法,调用起来更加方便。 Number.prototype.add = function (arg) { return accAdd(arg, this); }; Number.prototype.sub = function (arg) { return accSub(arg, this); }; Number.prototype.mul = function (arg) { return accMul(arg, this); }; Number.prototype.div = function (arg) { return accDiv(arg, this); }; </script>
相关文章推荐
- 遍历树的两种方式的测试及比较
- JS生成不重复随机数
- 百度地图JavaScript API开发叠加行政区划图
- ext校验
- 用jsp方式通知客户端下载文件
- [学习笔记]JavaScript基础--全选
- Jsp之两个Jsp页面之间传输数据
- [学习笔记]JavaScript基础--定时器
- 如何使用Createjs来编写HTML5游戏(四)TweenJS和Tick动画
- [学习笔记]JavaScript基础--数组操作
- 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中
- js学习三:操作属性的方法
- 网页制作之JavaScript部分 2 - DOM操作
- jsonP跨域解决
- 【json】慕课网json学习
- PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
- JavaScript基础----25JS事件详解-事件对象
- JavaScript基础----24JS事件详解-事件处理
- JavaScript基础----23JS事件详解-事件流
- 浅谈jsp、freemarker、velocity区别