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开发随笔一 preventDefault的必要
Nov 25 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
Node.js读写文件之批量替换图片的实现方法
Sep 07 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 Javascript
Vue 中 a标签上href无法跳转的解决方式
Nov 12 Javascript
webpack常用构建优化策略小结
Nov 21 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
JS代码触发事件代码实例
Jan 02 Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 jQuery
swiperjs实现导航与tab页的联动
Dec 13 Javascript
详解Vue slot插槽
Nov 20 Vue.js
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
使用GD库生成带阴影文字的图片
2015/03/27 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python切片知识解析
2016/03/06 Python
详解Python中的文件操作
2016/08/28 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
深入浅析Python中的迭代器
2019/06/04 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
季度思想汇报
2014/01/01 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
创先争优活动心得体会
2014/09/04 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
困难补助申请报告
2015/05/19 职场文书
新年晚会开场白
2015/05/29 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android