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 EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
Oct 06 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
js实现新年倒计时效果
Dec 10 Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
Aug 25 Javascript
js如何找出字符串中的最长回文串
Jun 04 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
Node.js API详解之 tty功能与用法实例分析
Apr 27 Javascript
微信小程序多列表渲染数据开关互不影响的实现
Jun 05 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 URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
PHP读取xml方法介绍
2013/01/12 PHP
php常用的url处理函数总结
2014/11/19 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
javascript数据类型详解
2017/02/07 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
python实现清屏的方法
2015/04/30 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Python socket模块方法实现详解
2019/11/05 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
Python高并发和多线程有什么关系
2020/11/14 Python
python安装sklearn模块的方法详解
2020/11/28 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
致裁判员加油稿
2014/02/08 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
事业单位年度考核评语
2014/12/31 职场文书
教师节倡议书2015
2015/04/27 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python