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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 Javascript
基于jquery循环map功能的代码
Feb 26 Javascript
window.open以post方式将内容提交到新窗口
Dec 26 Javascript
jquery 卷帘效果实现代码(不同方向)
Feb 05 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
ExtJS4 动态生成的grid导出为excel示例
May 02 Javascript
bootstrap table分页模板和获取表中的ID方法
Jan 10 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
Bootstrap入门教程一Hello Bootstrap初识
Mar 02 Javascript
微信小程序canvas分享海报功能
Oct 31 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
PHP检测用户语言的方法
2015/06/15 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python中正则表达式的用法实例汇总
2014/08/18 Python
发布你的Python模块详解
2016/09/15 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
学生个人的自我评价分享
2013/11/05 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫