js计算精度问题小结


Posted in Javascript onApril 22, 2013
//问题比如:7*0.8 JavaScript算出来就是:5.6000000000000005
            //加法函数,用来得到精确的加法结果
            //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
            //调用:accAdd(arg1,arg2)
            //返回值:arg1加上arg2的精确结果
            function accAdd(arg1, arg2) {
                var r1, r2, m;
                try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
                try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
                m = Math.pow(10, Math.max(r1, r2))
                return (arg1 * m + arg2 * m) / m
            }
            //用法:
            //给Number类型增加一个add方法,调用起来更加方便。
            Number.prototype.add = function (arg) {
                return accAdd(arg, this);
            }
            //如:
            var t1 = 6.60;
            var t2 = 1.32;
            var t3 = 1.2;
            var t4 = 1.2;
            var t5 = 1.2;
            alert(Number(t1).add(Number(t2)).add(Number(t3)).add(Number(t4)).add(Number(t5)));
            //减法函数,用来得到精确的减法结果
            function Subtr(arg1, arg2) {
                var r1, r2, m, n;
                try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
                try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
                m = Math.pow(10, Math.max(r1, r2));
                //last modify by deeka
                //动态控制精度长度
                n = (r1 >= r2) ? r1 : r2;
                return ((arg1 * m - arg2 * m) / m).toFixed(n);
            }
            //乘法函数,用来得到精确的乘法结果
            //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
            //调用:accMul(arg1,arg2)
            //返回值:arg1乘以arg2的精确结果
            function accMul(arg1, arg2) {
                var m = 0, s1 = arg1.toString(), s2 = arg2.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类型增加一个mul方法,调用起来更加方便。
            Number.prototype.mul = function (arg) {
                return accMul(arg, this);
            }
            //除法函数,用来得到精确的除法结果
            //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
            //调用:accDiv(arg1,arg2)
            //返回值:arg1除以arg2的精确结果
            function accDiv(arg1, arg2) {
                var t1 = 0, t2 = 0, r1, r2;
                try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
                try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
                with (Math) {
                    r1 = Number(arg1.toString().replace(".", ""))
                    r2 = Number(arg2.toString().replace(".", ""))
                    return (r1 / r2) * pow(10, t2 - t1);
                }
            }
            //用法:
            //给Number类型增加一个div方法,调用起来更加方便。
Javascript 相关文章推荐
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
js getElementsByTagName的简写方式
Jun 27 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
Javascript检查图片大小不要让大图片撑破页面
Nov 04 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
JS实现一个按钮的方法
Feb 05 Javascript
JS设置下拉列表框当前所选值的方法
Dec 22 Javascript
js解决movebox移动问题
Mar 29 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
Vue自定义指令详解
Jul 28 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
Oct 04 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
Nov 03 Javascript
基于javascipt-dom编程 table对象的使用
Apr 22 #Javascript
用js实现小球的自由移动代码
Apr 22 #Javascript
jquery打开直接跳到网页最下面、最低端实现代码
Apr 22 #Javascript
防止浏览器记住用户名及密码的简单实用方法
Apr 22 #Javascript
js播放wav文件(源码)
Apr 22 #Javascript
如何将一个String和多个String值进行比较思路分析
Apr 22 #Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 #Javascript
You might like
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
Jquery ui css framework
2010/06/28 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
彻底理解js面向对象之继承
2018/02/04 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
python判断元素是否存在的实例方法
2020/09/24 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
阿波罗盒子:Apollo Box
2017/08/14 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
合唱兴趣小组活动总结
2014/07/10 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
员工表扬信怎么写
2015/05/05 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
毕业实习单位意见
2015/06/04 职场文书
教师继续教育反思周记
2015/06/25 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android