js中浮点型运算BUG的解决方法说明


Posted in Javascript onJanuary 06, 2014

曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化

//除法函数,用来得到精确的除法结果
//说明: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 accMul((r1 / r2),pow(10, t2 - t1));
    }
}

//乘法函数,用来得到精确的乘法结果
//说明: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)
}

//加法运算中级解决办法
function accAdd(arg1, arg2) {   
    var r1, r2, m, c;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }  
    c = Math.abs(r1 - r2);   
    m = Math.pow(10, Math.max(r1, r2))   
    if (c > 0) {   
        var cm = Math.pow(10, c);   
        if (r1 > r2) {   
            arg1 = Number(arg1.toString().replace(".", ""));   
            arg2 = Number(arg2.toString().replace(".", "")) * cm;   
        }   
        else {   
            arg1 = Number(arg1.toString().replace(".", "")) * cm;   
            arg2 = Number(arg2.toString().replace(".", ""));   
        }   
    }   
    else {   
        arg1 = Number(arg1.toString().replace(".", ""));   
        arg2 = Number(arg2.toString().replace(".", ""));   
    }   
    return accDiv((arg1 + arg2),m); 
}
Javascript 相关文章推荐
JS 字符串连接[性能比较]
May 10 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
jQuery实现图片上传和裁剪插件Croppie
Nov 29 Javascript
jQuery 3.0 的 setter和getter 模式详解
Jul 11 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
jQuery获取this当前对象子元素对象的方法
Nov 29 Javascript
js仿淘宝商品放大预览功能
Mar 15 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
Aug 16 Javascript
node使用request请求的方法
Dec 20 Javascript
Jquery操作radio的简单实例
Jan 06 #Javascript
jQuery选择器全面总结
Jan 06 #Javascript
JavaScript定义类的几种方式总结
Jan 06 #Javascript
javascript函数定义的几种区别小结
Jan 06 #Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
JavaScript将数据转换成整数的方法
Jan 04 #Javascript
You might like
php连接Access数据库错误及解决方法
2013/06/20 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
JavaScript之AOP编程实例
2015/07/17 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
原生js开发的日历插件
2017/02/04 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python unittest模块用法实例分析
2018/05/25 Python
详解python读取和输出到txt
2019/03/29 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
简单了解Django项目应用创建过程
2020/07/06 Python
python super()函数的基本使用
2020/09/10 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
应届生服务员求职信
2013/10/31 职场文书
简历自荐信
2013/12/02 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
二手车转让协议书
2015/01/29 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
工作收入证明模板
2015/06/12 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS