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 < formulaArray.length; i++) {
                    if (formulaArray[i] == ')') {
                        int begin = 0;
                        for (int j = i; j >= 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 < calcCharArr.length; j++){
                    if(calcCharArr[j] == calcSymbolChar[i]){
                        //System.out.println("找到了" + calcSymbolChar[i]);
                        //以符号为中心,以左右两边的其他符号为边界找到两边的数
                        float num1 = 0f;
                        float num2 = 0f;
                        int bottom = 0;
                        for(int k = j - 1; k >= 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 < calcString.length() && (calcCharArr[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;
    }

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值