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 相关文章推荐
插件:检测javascript的内存泄漏
Mar 04 Javascript
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
Bootstrap每天必学之简单入门
Nov 19 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
Layui动态生成select下拉选择框不显示的解决方法
Sep 24 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
javascript标签在页面中的位置探讨
2013/04/11 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
新手简单了解vue
2019/05/29 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
建筑学推荐信
2013/11/03 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
村委会贫困证明
2014/01/14 职场文书
中学生自我评价范文
2014/02/08 职场文书
中学生评语大全
2014/04/18 职场文书
护理专科学生自荐书
2014/07/05 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
导游词之青城山景区
2019/09/27 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python