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 相关文章推荐
JsRender for object语法简介
Oct 31 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
使用npm发布Node.JS程序包教程
Mar 02 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
javascript的BOM
May 03 Javascript
jQuery3.0中的buildFragment私有函数详解
Aug 16 Javascript
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
深入理解Vue nextTick 机制
Apr 28 Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
JavaScript高级程序设计之变量与作用域
Nov 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
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
vue二级路由设置方法
2018/02/09 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
Python写的一个简单DNS服务器实例
2014/06/04 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python