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 相关文章推荐
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
简介JavaScript中的setTime()方法的使用
Jun 11 Javascript
JavaScript用构造函数如何获取变量的类型名
Dec 23 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
layui对工具条进行选择性的显示方法
Sep 19 Javascript
vue使用原生swiper代码实例
Feb 05 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
python处理Excel xlrd的简单使用
2017/09/12 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
小学生竞选班长演讲稿
2014/04/24 职场文书
入党介绍人评语
2014/05/06 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
学生自我评语
2015/01/04 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技