- 加法
思路:
计算出小数点后更多的位数N, 做10的N次方,
两个加数各自乘以10的N次方再相加,
然后除以10的N次方
比如 3.14 + 3.1, 则过程为:
- 更多的位数2, 做10的2次方等于100,
- 3.14*100 + 3.1*100 = 624
- 624 / 100 = 6.24
function accAdd(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
}
- 减法
思路:
计算出小数点后更多的位数N, 做10的N次方,
两个加数各自乘以10的N次方再相减,
然后除以10的N次方
最后转换成转换成更多的位数toFixed(N)
比如 3.14 - 3.1, 则过程为:
- 更多的位数2, 做10的2次方等于100,
- 3.14*100 - 3.1*100 = 4
- 4 / 100 = 0.04
function Subtr(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);
}
- 乘法
思路:
两个乘数小数点之后位数相加得到N, 做10的N次方
两个乘数直接去掉小数点, 然后相乘
最后除以10的N次方
比如 3.14 * 3.1, 则过程为:
- 小数点之后位数相加得3, 做10的3次方1000,
- 314 * 31 = 9734
- 9734 / 1000 = 9.734
function accMul(arg1,arg2)
{
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)
}
- 除法
思路:
两个除数直接去掉小数点相除, 得M
除数的小数点位数减去被除数的小数点位数, 做10的N次方
然后, 用 M 乘以 10的N次方(复用上面乘法的实现)
比如 3.14 / 3.1, 则过程为:
- 直接去掉小数点相除 314 / 31 = 10.129,
- 除数的小数点位数1, 减去被除数的小数点位数2, 得 -1, 做10的-1次方得0.1
- 然后复用乘法的逻辑, 计算 10.129 * 0.1
- 小数点之后位数相加得4, 做10的4次方10000,
- 10129 * 1 = 10129
- 10129/ 10000 = 1.0129
function accDiv(arg1,arg2){
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){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return accMul((r1/r2),pow(10,t2-t1));
}
}
网友评论