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 相关文章推荐
jquery中对表单的基本操作代码
Jul 29 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
js简易namespace管理器 实例代码
Jun 21 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
实例详解JSON取值(key是中文或者数字)方式
Aug 24 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
Sep 26 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
微信小程序加载机制及运行机制图解
Nov 27 Javascript
Vue this.$router.push(参数)实现页面跳转操作
Sep 09 Javascript
原生JavaScript实现换肤
Feb 19 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中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python装饰器用法示例小结
2018/02/11 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python安装gdal的两种方法
2019/10/29 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
采购部经理岗位职责
2014/02/10 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis