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为iframe的body添加click事件的实现代码
Apr 07 Javascript
jQuery实现简洁的导航菜单效果
Nov 23 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
JS抛物线动画实例制作
Feb 24 Javascript
Vue EventBus自定义组件事件传递
Jun 25 Javascript
js+css实现红包雨效果
Jul 12 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 Javascript
ES6 Class中实现私有属性的一些方法总结
Jul 08 Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
Js apply方法详解
2017/02/16 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
element el-input directive数字进行控制
2018/10/11 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python循环语句之break与continue的用法
2015/10/14 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
对python生成业务报表的实例详解
2019/02/03 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
销售演讲稿范文
2014/01/08 职场文书
会计专业自我评价
2014/02/12 职场文书
小学开学典礼主持词
2014/03/19 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
开场白怎么写
2015/06/01 职场文书
信用卡工资证明范本
2015/06/19 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Golang map映射的用法
2022/04/22 Golang