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 相关文章推荐
基于jquery的修改当前TAB显示标题的代码
Dec 11 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
Dec 25 Javascript
javascript禁止访客复制网页内容的实现代码
Aug 05 Javascript
第二章之Bootstrap 页面排版样式
Apr 25 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
再谈Angular4 脏值检测(性能优化)
Apr 23 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
原生js+css实现tab切换功能
2020/09/17 Javascript
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
django下创建多个app并设置urls方法
2020/08/02 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
Python实现粒子群算法的示例
2021/02/14 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
任意存:BOXFUL
2018/05/21 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
如何进行Linux分区优化
2013/02/12 面试题
个人应聘自我评价分享
2013/11/18 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
日化店促销方案
2014/03/26 职场文书
八项规定对照检查材料
2014/08/31 职场文书
六查六看剖析材料
2014/10/06 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
工程服务质量承诺书
2015/04/29 职场文书