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 相关文章推荐
javascript 数组的方法集合
Jun 05 Javascript
js 键盘记录实现(兼容FireFox和IE)
Feb 07 Javascript
jquery 学习笔记一
Apr 07 Javascript
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
分享一款基于jQuery的视频播放插件
Oct 09 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
flexslider.js实现移动端轮播
Feb 05 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 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/11/05 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
php 中的closure用法详解
2017/06/12 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
详解Python中with语句的用法
2015/04/15 Python
python爬虫之百度API调用方法
2017/06/11 Python
Python实现自动上京东抢手机
2018/02/06 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python调用.NET库的方法步骤
2019/12/27 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
手机配件第一品牌:ZAGG
2017/05/28 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
总经理工作职责范文
2014/03/14 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
最美家庭活动方案
2014/08/31 职场文书
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
解决Oracle数据库用户密码过期
2022/05/11 Oracle