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; }
直接将方法粘到一个新类中(记得整理一下代码,这样有点乱),用的时候直接调用