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 相关文章推荐
Script的加载方法小结
Jan 12 Javascript
jQuery.extend 函数详解
Feb 03 Javascript
javascript中的self和this用法小结
Feb 08 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
Apr 06 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
整理Javascript基础入门学习笔记
Nov 29 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 Javascript
详解适配器在JavaScript中的体现
Sep 28 Javascript
如何用Node写页面爬虫的工具集
Oct 26 Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 Javascript
vue搜索和vue模糊搜索代码实例
May 07 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 session 存储方式的详细介绍
2013/06/25 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
JavaScript 特殊字符
2007/04/05 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
angular.element方法汇总
2015/01/07 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
详解JS函数防抖
2020/06/05 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python3 shelve模块的详解
2017/07/08 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python是怎么被发明的
2020/06/15 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
专业技术人员年度考核评语
2014/12/31 职场文书
医院科室评语
2015/01/04 职场文书
小学元宵节活动总结
2015/02/06 职场文书
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL