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);
}
例如: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);
}
相关文章推荐
- JS计算浮点数加减乘除精确数值的方法
- js关于精确计算和数值格式化以及直接引js文件
- js关于精确计算和数值格式化,直接引js文件
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- JS中用于精确计算的加减乘除方法
- js关于精确计算和数值格式化以及直接引js文件
- 实现js浮点数加、减、乘、除的精确计算(网上很多文章里的方法是不能解决所有js浮点数计算误差的)
- JS无法进行数值精确计算的问题
- js 计算两个文本框数值和(差、商)
- js 屏幕计算方法
- N年前采用过的计算数值导数而且不会导致序列偏移的基于样条曲线的巧妙方法
- JS 计算时间差 精确到 天/月/时/分/秒/毫秒
- JS 浮点值精确计算
- js 精确计算
- 数值计算方法程序库
- JS精确计算
- js计算字符串长度、汉字校验、去除空格、数字校验、身份证校验的方法
- js中计算中文长度方法(转)
- js 闭包的概念 方法链的调用 下拉框测试 表单action数值替换
- 数值计算方法程序库