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 相关文章推荐
用js重建星际争霸
Dec 22 Javascript
浅谈checkbox的一些操作(实战经验)
Nov 20 Javascript
jquery选择器之基本过滤选择器详解
Jan 27 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
May 26 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
JavaScrip数组去重操作实例小结
Jun 20 Javascript
Vue封装Axios请求和拦截器的步骤
Sep 16 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
vue实现图书管理系统
Dec 29 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
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
jQuery Plupload上传插件的使用
2017/04/19 jQuery
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
python微信公众号开发简单流程
2018/03/23 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Django 静态文件配置过程详解
2019/07/23 Python
详解Python self 参数
2019/08/30 Python
Python文件操作基础流程解析
2020/03/19 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
家长给孩子的表扬信
2014/01/17 职场文书
医院信息公开实施方案
2014/05/09 职场文书
音乐教师求职信
2014/06/28 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
甜品店创业计划书
2014/09/21 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
汉语拼音教学反思
2016/02/22 职场文书