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控制上传文件的大小
Oct 26 Javascript
Javascript事件热键兼容ie|firefox
Dec 30 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 Javascript
jQuery取消ajax请求的方法
Jun 09 Javascript
jQuery实现的分子运动小球碰撞效果
Jan 27 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
Sep 29 Javascript
vue实现广告栏上下滚动效果
Nov 26 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中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
理解javascript中try...catch...finally
2015/12/25 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
详细讲解Python中的文件I/O操作
2015/05/24 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
Python 操作 MySQL数据库
2020/09/18 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
类的核心特性有哪些
2014/01/01 面试题
制定岗位职责的原则
2013/11/08 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
2019年教师入党申请书
2019/06/27 职场文书
创业计划书之家政服务
2019/09/18 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP