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 相关文章推荐
jquery cookie插件代码类
May 26 Javascript
javascript 当前日期加(天、周、月、年)
Aug 09 Javascript
js获取本机的外网/广域网ip地址完整源码
Aug 12 Javascript
js对文章内容进行分页示例代码
Mar 05 Javascript
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
javascript实现密码强度显示
Mar 18 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 Javascript
详解处理Vue单页面应用SEO的另一种思路
Nov 09 Javascript
js实现提交前对列表数据的增删改查
Jan 16 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 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 设计模式之 工厂模式
2008/12/19 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
Python里隐藏的“禅”
2014/06/16 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
详解python持久化文件读写
2019/04/06 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
董事长职责范文
2013/11/08 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
英语故事演讲稿
2014/04/29 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
员工工作表扬信
2015/05/05 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android