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 相关文章推荐
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
详解ECharts使用心得总结
Dec 06 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
Jun 05 Javascript
Angular将填入表单的数据渲染到表格的方法
Sep 22 Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
vue中使用input[type="file"]实现文件上传功能
Sep 10 Javascript
详解JavaScript函数callee、call、apply的区别
Mar 08 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
NT IIS下用ODBC连接数据库
2006/10/09 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
详解uniapp的全局变量实现方式
2021/01/11 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
python中退出多层循环的方法
2018/11/27 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
新学期校长寄语
2014/01/18 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
团结主题班会
2015/08/13 职场文书
初中生物教学反思
2016/02/20 职场文书