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 元素相对定位代码
Oct 15 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
May 01 Javascript
使用js画图之饼图
Jan 12 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
JavaScript门面模式详解
Oct 19 Javascript
Koa2微信公众号开发之消息管理
May 16 Javascript
详解如何用VUE写一个多用模态框组件模版
Sep 27 Javascript
webpack 开发和生产并行设置的方法
Nov 08 Javascript
Vue的编码技巧与规范使用详解
Aug 28 Javascript
Vue仿Bibibili首页的问题
Jan 21 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
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
php加密解密字符串示例
2016/10/13 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
python求列表交集的方法汇总
2014/11/10 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
新人入职感言
2015/07/31 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android