js中的加减乘除运算方法
开发中常常会遇到价格的计算,前端的计算方法有很多,在这里总结一下,并且说一下存在的问题!下面给出两种方法,不过个人比较推荐第一种方法,清晰明了!谷歌浏览器下第二种方法可能会丢精度,第一种方法可避免这个错误,方法1是自己实践和使用最多的,比较成熟,没啥问题!如果发现问题的可以指出来,谢谢阅读。
第一种计算方式如下:
function decNum(a){/*获取小数位数*/
var r=0;
if(!isNull(a)){
a=a.toString();
if(a.indexOf(".")!== -1) r=a.split(".")[1].length;
}
return r;
}
function int(a){/*去除小数点并转成数值*/
if(!isNull(a)){
if(Number(a)==0){
return parseInt("0");
}else{
return parseInt(a.toString().replace(".",""));
}
}else{
return parseInt("0");
}
}
function calc(a,b,type){//加减乘除
var r,
da=decNum(a),
db=decNum(b),
dsum=da+db,
dmin=Math.min(da,db),
dmax=Math.max(da,db);
dsum+=dmax-dmin;
dsum=Math.pow(10,dsum);
dmax=Math.pow(10,dmax);
a=int(a);
b=int(b);
if(da>db){
b*=Math.pow(10,da-db);
}else{
a*=Math.pow(10,db-da);
}
switch(type){
case "add":
r=(a+b)/dmax;
break;
case "subtract":
r=(a-b)/dmax;
break;
case "multiply":
r=(a*b)/dsum;
break;
case "divide":
r=a/b;
break;
}
return r;
}
调用的方法为:
s=calc(0.11,0.21,"add");
s=calc(-0.12,0.23,"add");
s=calc(0.21,0.3,"subtract");
s=calc(0.005,0.01,"multiply");
s=calc(2.2,100,"divide");
这个方法有参考别的计算方法,并做了优化,之前别的人的方法如果是存在 s=calc(0,0.2,"add"),会计算出错,固int(a)方法做了修复操作!
第二种方法:
//加
function floatAdd(arg1,arg2){
var 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));
return (arg1*m+arg2*m)/m;
}
//上面方法两位数相加在谷歌浏览器里有可能丢失精度,可选择下面这个方法floatAddtoFixed(arg1,arg2,num)
function floatAddtoFixed(arg1,arg2,num){
var 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));
return toFixed((arg1*m+arg2*m)/m,num);
}
//减 arg1 被减数 ,arg2 减数
function floatSub(arg1,arg2){
var 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));
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//乘 arg1 被乘数 ,arg2 乘数,arg3 保留位数
function floatMul(arg1,arg2,arg3) {
var 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)).toFixed(arg3);
}
//除 arg1 被除数 ,arg2 除数,arg3 保留位数
function floatDiv(arg1,arg2,arg3){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
r1=Number(arg1.toString().replace(".",""));
r2=Number(arg2.toString().replace(".",""));
return ((r1/r2)*Math.pow(10,t2-t1)).toFixed(arg3);
}
//toFixed 修复
function toFixed(num, s) {
var times = Math.pow(10, s)
var des = num * times + 0.5
des = parseInt(des, 10) / times
return des + ''
}
第二种方法直接按需调用即可。