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 相关文章推荐
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
jquery 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
javascript实现2048游戏示例
May 04 Javascript
js 截取或者替换字符串中的数字实现方法
Jun 13 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
Oct 28 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
Dec 26 Javascript
聊聊JS动画库 Velocity.js的使用
Mar 13 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 Javascript
vant 解决tab切换插件标题样式自定义的问题
Nov 13 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实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
PHP简单遍历对象示例
2016/09/28 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
js中this的用法实例分析
2015/01/10 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
Python 面试中 8 个必考问题
2018/11/16 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
MySQL面试题目集锦
2016/04/14 面试题
一年级班主任寄语
2014/01/19 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
2014年学生会工作总结
2014/11/07 职场文书
实习指导教师评语
2014/12/30 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
一文解答什么是MySQL的回表
2022/08/05 MySQL
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL