您的位置:首页 > Web前端 > JavaScript

JS精确计算数值方法

2016-12-30 00:00 309 查看
摘要: JS在页面上处理加减乘除时很容易丢失进度的问题,
例如:0.3-0.1=0.19999999999999998,实际值应该是0.2,所以页面我们要对数值进行处理。

1、加法

/**
* 精确计算两数的和
* @method additive
* @param {Number} v1 有效数值1
* @param {Number} v2 有效数值2
* @return {Number} 两数值的和
*/
function additive(v1,v2){
var n1,n2,m;
//获取两数的浮点位数
try{n1=v1.toString().split(".")[1].length;}catch(e){n1=0}
try{n2=v2.toString().split(".")[1].length;}catch(e){n2=0}
//获取10为底数,最大两位数值的浮点位数次幂
m=Math.pow(10,Math.max(n1,n2));
return (v1*m+v2*m)/m;
}

2、减法

/**
* 精确计算两数的差
* @method subtraction
* @param {Number} v1 有效数值1
* @param {Number} v2 有效数值2
* @return {Number} v1-v2两数值的差
*/
function subtraction(v1,v2){
var n1,n2,m,n;
//获取两数的浮点位数
try{n1=v1.toString().split(".")[1].length}catch(e){n1=0}
try{n2=v2.toString().split(".")[1].length}catch(e){n2=0}
//获取10为底数,数值的最大浮点位数次幂
m=Math.pow(10,Math.max(n1,n2));
//获取数值的最大浮点位数,设置为返回值的精度长度
n=Math.max(n1,n2);
//toFixed格式化数值位数
return ((v1*m-v2*m)/m).toFixed(n);
}

3、除法

/**
* 精确计算两数的商
* @method division
* @param {Number} v1 有效数值1 被除数
* @param {Number} v2 有效数值2 除数
* @return {Number} 两数值的商
*/
function division(v1,v2){
var t1=0,t2=0,n1,n2;
var s1=v1.toString();
var s2=v2.toString();
//获取两数的浮点位数
try{t1=s1.split(".")[1].length}catch(e){}
try{t2=s2.split(".")[1].length}catch(e){}
//去除小数点符号,获取整数
n1=Number(s1.replace(".",""))
n2=Number(s2.replace(".",""))
//两整数相除,乘以10为底数的(除数浮点位数-被除数的浮点位数)
return (n1/n2)*pow(10,t2-t1);
}

4、乘法

/**
* 精确计算两数的积
* @method subtraction
* @param {Number} v1 有效数值1
* @param {Number} v2 有效数值2
* @return {Number} 两数值的乘积
*/
function multiplication(v1,v2) {
var m=0;
s1=v1.toString();
s2=v2.toString();
//获取两数的浮点位数
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
//去除小数点的两数相乘,除以(10为底数,两值浮点位数的次幂)
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java Javassist