You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing计算器多运算输出0.0问题及BODMAS规则适配需求

Java Swing计算器多步运算故障修复(支持BODMAS规则)

我用Java Swing开发了一款计算器,已完成窗体创建与按钮布局,采用ActionListener接口实现交互。单步两操作数运算(如5+2)可正常执行,但执行多步多操作数运算(如10+2-5)时,每次输出均为0.0。需要让计算器支持多步运算且遵循BODMAS规则。

现有代码结构

类全局变量

public class Calculator implements ActionListener{
    float[] result=new float[10];
    char[] operation=new char[10];
    int i=0;
    boolean isOperationClicked=false; // 补全原代码遗漏的变量类型
}

运算按钮(+)的ActionListener实现

else if(e.getSource()==plusbutton) {
    isOperationClicked=true;
    String oldValue=displaylabel.getText();
    result=new float[10];
    result[i]=Float.parseFloat(oldValue);
    operation=new char[10];
    operation[i]= '+';
    i++;
}

等于按钮的ActionListener实现

else if(e.getSource()==equaltobutton) {
    int m=0;
    String finalvalue=displaylabel.getText();
    float finalvalueF=Float.parseFloat(finalvalue);
    result[i]=finalvalueF;
    while(m<i) {
        if(operation[m]=='/') {
            float res=result[m]/result[m+1];
            result=removeArrayF(result,m);
            result[m]=res;
            operation=removeArrayC(operation,m);
            i--;m--;
        }
        m++;
    }
    displaylabel.setText(result[0]+"");
}

问题分析与修改方案

1. 运算按钮中重置数组导致历史数据丢失

每次点击运算按钮时,你都执行了result=new float[10];和operation=new char[10];,这会直接清空之前存储的运算数和操作符,导致多步运算时只有最后一次的操作数被保留,最终计算结果出错。

修改方法:删除这两行数组重置代码,仅保留赋值逻辑:

else if(e.getSource()==plusbutton) {
    isOperationClicked=true;
    String oldValue=displaylabel.getText();
    // 移除数组重置代码
    // result=new float[10];
    result[i]=Float.parseFloat(oldValue);
    // operation=new char[10];
    operation[i]= '+';
    i++;
}

其他运算按钮(-、*、/)的逻辑需做同样修改。

2. 等于按钮仅处理除法,未覆盖BODMAS全规则

当前代码只处理了除法,而BODMAS要求先执行乘除(*、/),再执行加减(+、-),需要补充完整的优先级处理逻辑:

修改后的等于按钮代码:

else if(e.getSource()==equaltobutton) {
    int m=0;
    String finalvalue=displaylabel.getText();
    float finalvalueF=Float.parseFloat(finalvalue);
    result[i]=finalvalueF;

    // 第一步:处理乘除(高优先级)
    m=0;
    while(m < i) {
        if(operation[m]=='*') {
            float res=result[m] * result[m+1];
            result=removeArrayF(result,m);
            result[m]=res;
            operation=removeArrayC(operation,m);
            i--;m--;
        } else if(operation[m]=='/') {
            // 增加除数为0的错误判断
            if(result[m+1] == 0) {
                displaylabel.setText("Error");
                i=0;
                return;
            }
            float res=result[m] / result[m+1];
            result=removeArrayF(result,m);
            result[m]=res;
            operation=removeArrayC(operation,m);
            i--;m--;
        }
        m++;
    }

    // 第二步:处理加减(低优先级)
    m=0;
    while(m < i) {
        if(operation[m]=='+') {
            float res=result[m] + result[m+1];
            result=removeArrayF(result,m);
            result[m]=res;
            operation=removeArrayC(operation,m);
            i--;m--;
        } else if(operation[m]=='-') {
            float res=result[m] - result[m+1];
            result=removeArrayF(result,m);
            result[m]=res;
            operation=removeArrayC(operation,m);
            i--;m--;
        }
        m++;
    }

    displaylabel.setText(String.valueOf(result[0]));
    // 运算完成后重置索引,准备下一次运算
    i=0;
}

3. 状态重置与变量补全

  • 确保isOperationClicked变量已声明boolean类型;
  • 点击等于按钮运算完成后,必须重置i=0,否则下次运算会从旧索引继续,引发数组越界或数据混乱;
  • 数字按钮的逻辑要配合isOperationClicked:点击运算按钮后,isOperationClicked设为true,此时点击数字按钮应清空显示屏输入新数字,并将isOperationClicked重置为false。

4. 替换数组为集合避免越界风险

固定长度数组(10个元素)无法支持超过10步的运算,建议用ArrayList替代数组,更灵活且无需手动管理长度:

替换后的全局变量:

public class Calculator implements ActionListener{
    ArrayList<Float> resultList = new ArrayList<>();
    ArrayList<Character> operationList = new ArrayList<>();
    boolean isOperationClicked=false;
}

运算按钮修改示例:

else if(e.getSource()==plusbutton) {
    isOperationClicked=true;
    String oldValue=displaylabel.getText();
    resultList.add(Float.parseFloat(oldValue));
    operationList.add('+');
}

等于按钮处理逻辑简化示例:

// 处理乘法时
float res = resultList.get(m) * resultList.get(m+1);
resultList.remove(m);
resultList.set(m, res);
operationList.remove(m);
// 无需维护i变量,直接用resultList.size()判断运算进度

内容的提问来源于stack exchange,提问作者Amalshanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:06:14