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 相关文章推荐
javascript生成/解析dom的CDATA类型的字段的代码
Apr 22 Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
Jan 04 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
Dec 24 Javascript
vue.js入门教程之计算属性
Sep 01 Javascript
js实现StringBuffer的简单实例
Sep 02 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 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小偷的核心程序
2007/04/09 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python pandas时序处理相关功能详解
2019/07/03 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
什么是GWT的Entry Point
2013/08/16 面试题
临床医学应届生求职信
2013/11/06 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
自主实习接收函
2014/01/13 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
房地产促销活动方案
2014/03/01 职场文书
食品业务员岗位职责
2014/03/18 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
车间安全生产标语
2014/06/06 职场文书
离婚协议书怎么写
2014/09/12 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
财务稽核岗位职责
2015/04/13 职场文书
毕业证明模板
2015/06/19 职场文书
高中历史教学反思
2016/02/19 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript