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 相关文章推荐
封装好的省市地区联动控件附下载
Aug 13 Javascript
js修改table中Td的值(定义td的双击事件)
Jan 10 Javascript
javascript一元操作符(递增、递减)使用示例
Aug 07 Javascript
JavaScript prototype 使用介绍
Aug 29 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
js实现简单锁屏功能实例
May 27 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
May 05 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
Vue数据绑定简析小结
May 07 Javascript
JS实现的自定义map方法示例
May 17 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
VuePress 中如何增加用户登录功能
Nov 29 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和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
PHP实现简单的计算器
2020/08/28 PHP
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
大数据分析用java还是Python
2020/07/06 Python
汉语专业应届生求职信
2013/10/01 职场文书
社会实践心得体会
2014/01/03 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python