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 创建对象(常见的几种方法)
Nov 03 Javascript
JQuery中上下文选择器实现方法
May 18 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
Node.js中的http请求客户端示例(request client)
May 04 Javascript
原生JS实现日历组件的示例代码
Sep 22 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
Oct 31 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 Javascript
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
Element Carousel 走马灯的具体实现
Jul 26 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
javascript实现的listview效果
2007/04/28 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
python3 线性回归验证方法
2019/07/09 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
优秀教师演讲稿
2014/05/06 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
公司授权委托书范文
2014/09/21 职场文书
医生个人年终总结
2015/02/28 职场文书
个人借条范本
2015/05/25 职场文书
同意报考公务员证明
2015/06/17 职场文书
乔迁新居祝福语
2019/11/04 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL