js 自定义加减乘除方法(防止js自身计算错误)

  • A+
所属分类:JavaScript

今天遇见一个js计算小数相除出现的bug,网上搜罗了一番,找到不少相关的文章,我也保存转发一波。^_^

/**
 乘法
@param arg1
@param arg2
@returns {Number}
*/
function accMul(arg1, arg2) {
  let m = 0, s1 = arg1.toString(), 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)
}
/** 除法 @param arg1 @param arg2 @returns {Number} */
function accDiv(arg1, arg2) { let t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.toString().split(".")[1].length } catch (e) { } try { t2 = arg2.toString().split(".")[1].length } catch (e) { } /* with (Math) {
网上很多文章中 都有用这个 with语句, 我不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源 并且严格模式下会报错 */
r1 = Number(arg1.toString().replace(".", ""))
r2 = Number(arg2.toString().replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);// 在这里只要写全pow方法就可以了 Math.pow()
// }
}
/** 加法
@param arg1
@param arg2
@returns {Number}
*/
function accAdd(arg1, arg2) {
let r1, r2, m, c;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2))
if (c > 0) {
const cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
}
else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
}
else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m
}
/** 减法
@param arg1
@param arg2
@returns
*/
function accSub(arg1, arg2){
let r1, r2, m, n;
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));
// lastmodify by deeka
// 动态控制精度长度
// n=(r1>=r2)?r1:r2;
return ((arg1*m - arg2*m)/m);
}

weinxin
我的微信
爱生活、爱学习的小伙伴可以通过扫一扫二维码添加我的个人微信一起交流!
青青子衿

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: