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 相关文章推荐
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
Feb 13 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
jquery div模态窗口的简单实例
May 28 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
详解npm 配置项registry修改为淘宝镜像
Sep 07 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
Sep 20 Javascript
Vue的click事件防抖和节流处理详解
Nov 13 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
Python自动重试HTTP连接装饰器
2015/04/28 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Python实现汇率转换操作
2020/05/03 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
初二物理教学反思
2014/01/29 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Python中的pprint模块
2021/11/27 Python
九大龙王魂骨,山龙王留下躯干骨,榜首死的最憋屈(被捏碎)
2022/03/18 国漫
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL