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 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
使用jquery读取html5 localstorage的值的方法
Jan 04 Javascript
JQuery实现绚丽的横向下拉菜单
Dec 19 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
Mar 04 Javascript
详解javascript传统方法实现异步校验
Jan 22 Javascript
JavaScript tab选项卡插件实例代码
Feb 23 Javascript
js实现放大镜特效
May 18 Javascript
js防刷新的倒计时代码 js倒计时代码
Sep 06 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
Vue前端项目部署IIS的实现
Jan 06 Javascript
vue.js iview打包上线后字体图标不显示解决办法
Jan 20 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 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初学者最感迷茫的问题小结
2010/03/27 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP解决中文乱码
2017/04/28 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
图片自动更新(说明)
2006/10/02 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JavaScript多线程详解
2015/08/12 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
python 实现归并排序算法
2012/06/05 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
实习生单位鉴定意见
2013/12/04 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
早会开场白台词大全
2015/06/01 职场文书
阿甘正传观后感
2015/06/01 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python