> 文档中心 > java实现简单公式后台计算,只需传入数学公式即可得出值

java实现简单公式后台计算,只需传入数学公式即可得出值

 public static void main(String[] args) { String formula = "(((2*3+1+8)*5+1)/2)";// String equalationLeft = formula.split("=")[0];// String equalationRight = formula.split("=")[1]; /** 获取变量表: **/// getVarList(equalationRight); /** 代回公式进行替换 **/ String newFormula = replaceEquation(formula); /** 进行计算 **/ System.out.println("newFormula======="+newFormula); float result = calc(newFormula); System.out.println("最终结果:" + result);    }

这是测试的主程序,我传入的公式为 ((2*3+1+8)*5+1)/2 但是在表达式中的formula变量必须还要再加一层括号。具体计算的方法为 calc(newFormula),直接将公式传入,调取以后方法:

/** 进行计算 **/    private static float calc(String newFormula) { boolean stillHaveCalcSymbol = false; do{     //System.out.println("before:" + newFormula);     /** 寻找最后一个左括号里面到第一个右括号里面1的内容 **/     char formulaArray[] = newFormula.toCharArray();     for (int i = 0; i < formulaArray.length; i++) {  if (formulaArray[i] == '+' || formulaArray[i] == '-'   || formulaArray[i] == '*' || formulaArray[i] == '/'   || formulaArray[i] == '(' || formulaArray[i] == ')') {      stillHaveCalcSymbol = true;  } else {      stillHaveCalcSymbol = false;  }     }     if (stillHaveCalcSymbol) {  String resultFormula = "";  //找最内层的括号里面的内容出来(含括号)  for (int i = 0; i = 0; j--) {if (formulaArray[j] == '(') {    begin = j;    break;}   }//以上面得到的开始位置和结束位置为准,截取中间内容   String calcString = newFormula.substring(begin, i + 1);   resultFormula = newFormula.replace(calcString,     calcProc(calcString) + "");   //System.out.println(calcString);   break;      }  }  newFormula = resultFormula;     } } while(stillHaveCalcSymbol); //最后得到普通的顺序无括号公式: System.out.println("*********==="+newFormula); //最后一次计算: float result = calcProc("(" + newFormula + ")"); return result;    }
/**详细计算过程**/    private static float calcProc(String calcString) {//if(calcString.contains("=")){//calcString = calcString.split("=")[1];//} //calcString = calcString.replace("(", ""); //calcString = calcString.replace(")", ""); String calcSymbol[] = {"\\*", "\\/", "\\+", "\\-"}; char calcSymbolChar[] = {'*', '/', '+', '-'}; boolean haveSymbol = true; float result = 0f; while(haveSymbol){     System.out.println("calcStr:" + calcString);     char calcCharArr[] = calcString.toCharArray();     result = 0f;     for (int i = 0; i < calcSymbol.length; i++) {  boolean alreadyFind = false;  for(int j = 0; j = 0 && (calcCharArr[k] >= '0' && calcCharArr[k] <= '9' || calcCharArr[k] == '.') ; k--){//System.out.println(calcCharArr[k] + "");bottom = k;   }   //System.out.println("[j, bottom]:" + String.format("[%d, %d]", j, bottom));   num1 = Float.valueOf(calcString.substring(bottom, j));   System.out.println("num1:" + num1);   int top = 0;   for(int k = j + 1; k = '0' && calcCharArr[k] <= '9' || calcCharArr[k] == '.'); k++){top = k;   }   num2 = Float.valueOf(calcString.substring(j + 1, top + 1));   System.out.println("num2:" + num2);   switch(calcSymbolChar[i]){case '*':    result = num1 * num2;    break;case '/':    result = num1 / num2;    break;case '+':    result = num1 + num2;    break;case '-':    result = num1 - num2;    break;   }   //System.out.println("bottom to top:" + calcString.substring(bottom + 1, top + 1));   calcString = calcString.replace(calcString.substring(bottom, top + 1), String.format("%.5f", result));   //System.out.println("end_calcStr:" + calcString);   alreadyFind = true;   break;      }  }  if(alreadyFind) break;     }     haveSymbol = false;     if(calcString.contains("*") || calcString.contains("/") || calcString.contains("+") || calcString.contains("-")){  haveSymbol = true;  //System.out.println("找到");     } else {  //System.out.println("找不到");     } } //System.out.println("result:" + result); return result;    }

直接将方法粘到一个新类中(记得整理一下代码,这样有点乱),用的时候直接调用