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 技巧和窍门整理(8个)
Apr 22 Javascript
JavaScript中继承用法实例分析
May 16 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
Aug 17 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
Apr 26 Javascript
jQuery实现简洁的轮播图效果实例
Sep 07 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
hammer.js实现图片手势放大效果
Aug 29 Javascript
学习RxJS之JavaScript框架Cycle.js
Jun 17 Javascript
vuex实现数据状态持久化
Nov 11 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 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
我常用的几个类
2006/10/09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
潜说js对象和数组
2011/05/25 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
codeMirror插件使用讲解
2017/01/16 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
python实现简易通讯录修改版
2018/03/13 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python redis 删除key脚本的实例
2019/02/19 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
转党组织关系介绍信
2014/01/08 职场文书
美术教师岗位职责
2014/03/18 职场文书
对教师的评语
2014/04/28 职场文书
服务标兵事迹材料
2014/05/04 职场文书
关于环保的演讲稿
2014/05/10 职场文书
扬尘污染防治方案
2014/06/15 职场文书
三八活动策划方案
2014/08/17 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
七年级数学教学反思
2016/02/17 职场文书