博主前面写的一篇博文微信小程序(看文档写实例一)微信小程序计算器实例中,四则运算那个,有同学说有Bug,于是用20分钟用Java写了一个方法,当然由于没有用逆波兰表达式,没有考虑()以及乘数带负号,如果考虑()以及乘数带负号那么就要用栈和逆波兰表达式的中缀和后缀式了,不过这没有给,只是给前面的同学提供一个参考。

思路很简单,按+-×÷分割,+分割完给-分割然后给×最后给÷分割,如果分割+后有-就算-,有×就算×,有÷就算÷,直到结果。这里有个值得注意的小问题,就是在-的时间,前面有负号和没有负号,如果有-号,分割后第一个索引是没有值的,由于第一位是负号,于是算第一个数要取反,后面就是都是减了,代码很简单如下:

    public static double cal_add(String s){
        if(s.length()==0||s == null)return 0;
        double sum = 0;
        String []adds = s.split("\\+");
        for(int i=0;i<adds.length;i++){
            if(adds[i].equals(""))continue;
            if(adds[i].contains("-")) sum += cal_sub(adds[i]);
            else if(adds[i].contains("×")) sum += cal_m(adds[i]);
            else if(adds[i].contains("÷")) sum += cal_d(adds[i]);
            else sum +=Double.parseDouble(adds[i]);
        }
        return sum;
    }
    public static double cal_sub(String s){
        if(s.length()==0||s == null)return 0;
        double sum = 0;
        String []subs = s.split("-");
        for(int i=0;i<subs.length;i++){
            if(i == 0) {
                if (!subs[i].equals("")) {
                    if(subs[i].contains("×")) sum += cal_m(subs[i]);
                    else if(subs[i].contains("÷")) sum += cal_d(subs[i]);
                    else sum += Double.parseDouble(subs[i]);
                }
            }
            else{
                if(subs[i].contains("×")) sum += -cal_m(subs[i]);
                else if(subs[i].contains("÷")) sum += -cal_d(subs[i]);
                else sum += -Double.parseDouble(subs[i]);
            }
        }
        return sum;
    }
    public static double cal_m(String s){
        if(s.length()==0||s == null)return 0;
        double sum = 1;
        String []ms = s.split("×");
        for(int i=0;i<ms.length;i++){
            if(ms[i].contains("÷")) sum *= cal_d(ms[i]);
            else sum *= Double.parseDouble(ms[i]);
        }
        return sum;
    }
    public static double cal_d(String s){
        if(s.length()==0||s == null)return 0;
        double sum = 1;
        String []cs = s.split("÷");
        for(int i=0;i<cs.length;i++){
            if(i == 0) sum *= Double.parseDouble(cs[i]);
            else sum /= Double.parseDouble(cs[i]);
        }
        return sum;
    }

结果:

System.out.println(cal_add("8+7÷2+5×3-6÷2"));