前端 precision 精度计算 封装 加减乘除

我们在项目中精度是避免不了的。
我们注意的是需要运用到的方法有

1、 Math.pow() 方法可返回 x 的 y 次幂的值。
他的语法:Math.pow(x,y)
参数描述
x 必需。底数。必须是数字。
y 必需。幂数。必须是数字。
返回值:x 的 y 次幂。
说明:如果结果是虚数或负数,则该方法将返回 NaN。如果由于指数过大而引起浮点溢出,则该方法将返回 Infinity 无穷大。
2、 Math.max() 函数返回一组数中的最大值。
3、 Math.round()四舍五入
4、 toString() 转换对象为字符串
5、 split(".") 截取
6、 toFixed()方法,可以把Number 四舍五入为指定小数位数的数字。
语法是 NumberObject.toFixed(num)
说明:num 必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
7、 replace()替换

下边就是运算

加法函数,用来得到精确的加法结果,避免数据相加小数点后产生多位数和计算精度损失。
说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。

说明:
	调用:accAdd(arg1,arg2)
	返回值:arg1加上arg2的精确结果
	代码如下
	
function accAdd(arg1, arg2) { // 定义两个参数
  let r1, r2, m;
  try {
    r1 = arg1.toString().split(".")[1].length; // 将数值转换成字符串,在进行分割
  } catch (e) {
    r1 = 0;
  }
  try {
    r2 = arg2.toString().split(".")[1].length;
  } catch (e) {
    r2 = 0;
  }
  m = Math.pow(10, Math.max(r1, r2)); // 这里先通过max方法拿到最大值,作为参数幂,10为底,在通过pow方法运算
  return (arg1 * m + arg2 * m) / m;
  //当我们需要计算精度到四舍五入的时候用下边的return,如果不要求就用上边的return
  //return Math.round(arg1*m+arg2*m)/m;
}

减法函数: 避免数据相减小数点后产生多位数和计算精度损失。
说明参数:arg1被减数 | arg2减数

function accSub(arg1, arg2) {
  let  r1, r2, m;
  let precision; // 精度
  try {
    r1 = arg1.toString().split(".")[1].length;
  } catch (e) {
    r1 = 0;
  }
  try {
    r2 = arg2.toString().split(".")[1].length;
  } catch (e) {
    r2 = 0;
  }
  m = Math.pow(10, Math.max(r1, r2));
  //动态控制精度长度
precision = (r1 >= r2) ? r1 : r2;
  return ((arg2 * m - arg1 * m) / m).toFixed(precision);
}

乘法函数,用来得到精确的乘法结果,避免数据相乘小数点后产生多位数和计算精度损失
说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

调用:accMul(arg1,arg2) 
参数说明:arg1被乘数 | arg2乘数
返回值:arg1乘以arg2的精确结果
代码如下

function accMul(arg1, arg2) {
  let m = 0,
  let s1 = arg1.toString(),
  let s2 = arg2.toString();
  try {
    m += s1.split(".")[1].length
  } catch (e) {}
  try {
    m += s2.split(".")[1].length
  } catch (e) {}
  return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
// 或者这样写跟上边的一样
// numMulti(num1, num2) {
// let 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);
// },

除法函数,用来得到精确的除法结果,避免数据相除小数点后产生多位数和计算精度损失
说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

调用:accDiv(arg1,arg2)
参数说明: arg1除数 | arg2被除数
返回值:arg1除以arg2的精确结果
function accDiv(arg1, arg2) {
 	let t1 = 0, t2 = 0,
 	let r1, r2;
  try {
    t1 = arg1.toString().split(".")[1].length
  } catch (e) {
 	t1 = 0	
  }
  try {
    t2 = arg2.toString().split(".")[1].length
  } catch (e) {
	t2 = 0
  }
  r1 = Number(arg1.toString().replace(".", ""));
  r2 = Number(arg2.toString().replace(".", ""));
  if (r2 == 0) {
    return Infinity;
  } else {
    return (r1 / r2) * Math.pow(10, t2 - t1);
  }
}

我们可以给Number类型增加一些方法,使用起来更为方便。

//	加法:给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg) {
  return accAdd(arg, this);
};
//  减法:给Number类增加一个sub方法,调用起来更加方便
Number.prototype.sub = function (arg) {
  return accSub(arg, this);
};
//  乘法:给Number类型增加一个mul方法
Number.prototype.mul = function (arg) {
  return accMul(arg, this);
};
// 除法:给Number类型扩展一个div方法
Number.prototype.div = function (arg) {
  return accDiv(this, arg);
};

导出这些方法
export {
	accAdd,
  	accSub,
	accMul,
	accDiv,
}
在需要的文件里引入这个计算的文件
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值