x-spreadsheet icon indicating copy to clipboard operation
x-spreadsheet copied to clipboard

单元格公式计算的bug

Open DemoJj opened this issue 4 years ago • 1 comments

  • 问题场景: 单元格内容: A1:10,B1:300 A2:=A1*B1/1000 此时A2计算结果应为 3 ,而实际输出结果为 0
  • 定位问题: 在 x-data-spreadsheet\src\core\helper.js 文件中 numberCalc 方法计算小数位时导致改问题
  • 修改后:
//加 
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; 
} 
   
//减 
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); 
} 
   
//乘 
function floatMul(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 floatDiv(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){} 
    
  r1=Number(arg1.toString().replace(".","")); 
  
  r2=Number(arg2.toString().replace(".","")); 
  return (r1/r2)*Math.pow(10,t2-t1); 
}

export function numberCalc(type, a1, a2) {
  
  if (Number.isNaN(a1) || Number.isNaN(a2)) {
    return a1 + type + a2;
  }
  const al1 = digits(a1);
  const al2 = digits(a2);
  const num1 = Number(a1);
  const num2 = Number(a2);
  let ret = 0;
  if (type === '-') {
    // ret = num1 - num2;
    ret = floatSub(num1,num2)
  } else if (type === '+') {
    // ret = num1 + num2;
    ret = floatAdd(num1,num2)
  } else if (type === '*') {
    // ret = num1 * num2;
    ret = floatMul(num1,num2)
  } else if (type === '/') {
    // ret = num1 / num2;
    ret = floatDiv(num1,num2)
  }
  // return ret.toFixed(Math.max(al1, al2));

  const al3 = digits(ret);
  return ret.toFixed(Math.max(al1, al2, al3));
}

DemoJj avatar Oct 13 '20 08:10 DemoJj

请问下有遇到公式中有括号的是否公式计算不正确的情况吗

W65138497 avatar Jul 27 '23 01:07 W65138497