关于JavaScript小数的加减乘除精度丢失问题

569 阅读1分钟
  1. 项目中遇到的是这样四个数相加的问题
accAdd(arg1, arg2, arg3, arg4) {
      var r1, r2, r3, r4, m;
      try {
        r1 = arg1.toString().split(".")[1].length;
      } catch (e) {
        r1 = 0;
      }
      try {
        r2 = arg2.toString().split(".")[1].length;
      } catch (e) {
        r2 = 0;
      }
      try {
        r3 = arg3.toString().split(".")[1].length;
      } catch (e) {
        r3 = 0;
      }
      try {
        r4 = arg4.toString().split(".")[1].length;
      } catch (e) {
        r4 = 0;
      }
      m = Math.pow(10, Math.max(r1, r2, r3, r4));
      return (arg1 * m + arg2 * m + arg3 * m + arg4 * m) / m;
    },
  1. 在网上看到一些完整的方法,参考链接www.jb51.net/article/854…
//除法
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)); 
 } 
 } 
 //乘法 
 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) 
 } 
//加法 
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 
} 
//减法 
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); 
}