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 随机数产生6位数字
May 13 Javascript
JavaScript中的关键字"VAR"使用详解 分享
Jul 31 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
JavaScript中getUTCMinutes()方法的使用详解
Jun 10 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
浅谈js中对象的使用
Aug 11 Javascript
微信小程序实现皮肤功能(夜间模式)
Jun 18 Javascript
JSON数据中存在单个转义字符“\”的处理方法
Jul 11 Javascript
vue+springboot+element+vue-resource实现文件上传教程
Oct 21 Javascript
vue实现树状表格效果
Dec 29 Vue.js
基于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中的面向对象OOP中的魔术方法
2017/06/12 PHP
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
JavaScript类库D
2010/10/24 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
jQuery的学习步骤
2011/02/23 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
微信小程序配置服务器提示验证token失败的解决方法
2019/04/03 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python安装后的目录在哪里
2020/06/21 Python
电大毕业生自我鉴定
2014/04/10 职场文书
蓝颜请假条
2014/04/11 职场文书
文艺晚会策划方案
2014/06/11 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
单位实习鉴定评语
2015/01/04 职场文书
邀请函模板
2015/02/02 职场文书