js加减乘除丢失精度问题解决方法


Posted in Javascript onMay 16, 2014

在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带小数的数据运算时总会出现好多位小数.这是因为在javascript中浮点数的计算是以2进制计算的。

/** 
* 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 
* 
* @param num1加数1 | num2加数2 
*/ 
function numAdd(num1, num2) { 
var baseNum, baseNum1, baseNum2; 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
return (num1 * baseNum + num2 * baseNum) / baseNum; 
}; 
/** 
* 加法运算,避免数据相减小数点后产生多位数和计算精度损失。 
* 
* @param num1被减数 | num2减数 
*/ 
function numSub(num1, num2) { 
var baseNum, baseNum1, baseNum2; 
var precision;// 精度 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2; 
return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision); 
}; 
/** 
* 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。 
* 
* @param num1被乘数 | num2乘数 
*/ 
function numMulti(num1, num2) { 
var baseNum = 0; 
try { 
baseNum += num1.toString().split(".")[1].length; 
} catch (e) { 
} 
try { 
baseNum += num2.toString().split(".")[1].length; 
} catch (e) { 
} 
return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum); 
}; 
/** 
* 除法运算,避免数据相除小数点后产生多位数和计算精度损失。 
* 
* @param num1被除数 | num2除数 
*/ 
function numDiv(num1, num2) { 
var baseNum1 = 0, baseNum2 = 0; 
var baseNum3, baseNum4; 
try { 
baseNum1 = num1.toString().split(".")[1].length; 
} catch (e) { 
baseNum1 = 0; 
} 
try { 
baseNum2 = num2.toString().split(".")[1].length; 
} catch (e) { 
baseNum2 = 0; 
} 
with (Math) { 
baseNum3 = Number(num1.toString().replace(".", "")); 
baseNum4 = Number(num2.toString().replace(".", "")); 
return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1); 
} 
};
Javascript 相关文章推荐
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
Jquery 基础学习笔记之文档处理
May 29 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
Feb 28 Javascript
javascript实现网页端解压并查看zip文件
Dec 15 Javascript
详解vue.js全局组件和局部组件
Apr 10 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
NW.js 简介与使用方法
Feb 01 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
May 31 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
js脚本获取webform服务器控件的方法
May 16 #Javascript
js加入收藏夹代码(兼容ie/ff/op)
May 16 #Javascript
javascript生成随机数的方法
May 16 #Javascript
从零学jquery之如何使用回调函数
May 16 #Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 #Javascript
Jquery倒计时源码分享
May 16 #Javascript
js取模(求余数)隔行变色
May 15 #Javascript
You might like
php empty() 检查一个变量是否为空
2011/11/10 PHP
一个简单的php路由类
2016/05/29 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
js同时按下两个方向键
2007/12/01 Javascript
javascript multibox 全选
2009/03/22 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
详解vue axios二次封装
2018/07/22 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
培训主管岗位职责
2014/02/01 职场文书
行政专员的岗位职责
2014/03/10 职场文书
核心价值观演讲稿
2014/05/13 职场文书
软环境建设心得体会
2014/09/09 职场文书
人与自然观后感
2015/06/16 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python