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 相关文章推荐
Mootools 1.2教程(3) 数组使用简介
Sep 14 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
js+css实现文字散开重组动画特效代码分享
Aug 21 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
Javascript之面向对象--方法
Dec 02 Javascript
基于Vue.js 2.0实现百度搜索框效果
Dec 28 Javascript
node vue项目开发之前后端分离实战记录
Dec 13 Javascript
JS设计模式之命令模式概念与用法分析
Feb 06 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
Jul 25 Javascript
flexible.js实现移动端rem适配方案
Apr 07 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
JS画5角星方法介绍
2013/09/17 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
简介JavaScript错误处理机制
2020/08/04 Javascript
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Python机器学习之决策树算法
2017/12/22 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python变量赋值的秘密分享
2018/04/03 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
前台接待岗位职责
2013/12/03 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
护士年终考核评语
2014/12/31 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
公司表扬信格式
2015/05/04 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
导游词之西安骊山
2019/12/20 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
详解JavaScript中Arguments对象用途
2021/08/30 Javascript