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 相关文章推荐
用js得到网页中所有的div的id
Oct 19 Javascript
用js实现手把手教你月入万刀(转贴)
Nov 07 Javascript
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
原生javascript实现解析XML文档与字符串
Mar 01 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
使用gulp构建前端自动化的方法示例
Dec 25 Javascript
JS使用Dijkstra算法求解最短路径
Jan 17 Javascript
layui 对table中的数据进行转义的实例
Sep 12 Javascript
vue表单数据交互提交演示教程
Nov 13 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
php错误级别的设置方法
2013/06/17 PHP
PHP实现搜索相似图片
2015/09/22 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python 文件读写操作实例详解
2014/03/12 Python
Python实现大文件排序的方法
2015/07/10 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
关于Python的一些学习总结
2018/05/25 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python实现交并比IOU教程
2020/04/16 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
新东网科技Java笔试题
2012/07/13 面试题
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
行政经理的岗位职责
2013/11/23 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
升职自荐书
2019/05/09 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android