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选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 Javascript
js仿搜狐视频记录片列表展示效果
May 30 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 Javascript
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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字符串 ==比较运算符的副作用
2009/10/21 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
怎样在程序里获得一个空指针
2015/01/24 面试题
大学生创业计划书
2014/08/14 职场文书
酒店端午节活动方案
2014/08/26 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
小学工作总结2015
2015/05/04 职场文书
汽车销售员工作总结
2015/08/12 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js