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 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
jquery获取iframe中的dom对象(两种方法)
Jul 02 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
原生js封装的ajax方法示例
Aug 02 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 Javascript
JS实现手风琴特效
Nov 08 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 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生成唯一的订单函数分享
2015/02/02 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
json 实例详细说明教程
2009/10/31 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Django实现单用户登录的方法示例
2019/03/28 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
如何在C# winform中异步调用web services
2015/09/21 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
《掌声》教学反思
2014/02/23 职场文书
交通事故和解协议书
2014/09/25 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android