有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的简单计算器不能很好地处理双数运算

我正在做一个基本的计算器,似乎很好用,除非当我尝试和/除。。。一个双倍的数字,例如5.5

然后,如果我尝试这样做:5.5+1,我得到的结果是56,而不是6.5。似乎我的逻辑没有抓住操作的关键

一些帮助将是非常感谢的

这是我的代码:

for (int i = 0; i < inputText.getText().toString().length(); i++) {
                if (Character.isDigit(inputText.getText().toString().charAt(i))) {
                    val += inputText.getText().toString().substring(i, i + 1);
                    if (i == inputText.getText().toString().length() - 1) {
                        vals.add(Double.parseDouble(val));
                    }
                } else if (inputText.getText().toString().substring(i, i + 1).equals("+")) {
                    vals.add(Double.parseDouble(val));
                    signs.add("+");
                    val = "";
                } else if (inputText.getText().toString().substring(i, i + 1).equals("-")) {
                    vals.add(Double.parseDouble(val));
                    signs.add("-");
                    val = "";
                } else if (inputText.getText().toString().substring(i, i + 1).equals("*")) {
                    vals.add(Double.parseDouble(val));
                    signs.add("*");
                    val = "";
                } else if (inputText.getText().toString().substring(i, i + 1).equals("/")) {
                    vals.add(Double.parseDouble(val));
                    signs.add("/");
                    val = "";
                }
            }

 double result = 0;
        for(int i=0; i < vals.size(); i++){
            if (i == 0){
                result = vals.get(i);
            }
            else {
                String sign = signs.get(i-1);
                switch (sign){
                    case "+":
                        result = vals.get(i) + result;
                        break;
                    case "-":
                        result = result - vals.get(i);
                        break;
                    case "/":
                        result = result / vals.get(i);
                        break;
                    case "*":
                        result = result * vals.get(i);
                        break;
                }
            }
        }

 1. I think that the problem is in this part of the code:

                //I can check the value of vals is 5.5 here when do the first loop in for loop
                ArrayList<Double> vals = new ArrayList<>();

    //but here the value of val is 55 and not 5.5
    val +=  inputText.getText().toString().substring(i, i + 1); //Then, I'm
        adding in the array the 55 instead the 5.5 if (i ==
        inputText.getText().toString().length() - 1) {
                                vals.add(Double.parseDouble(val));
                            }

共 (2) 个答案

  1. # 1 楼答案

    您的错误出现在以下情况:

    if (Character.isDigit(inputText.getText().toString().charAt(i))) {
        val += inputText.getText().toString().substring(i, i + 1);
        if (i == inputText.getText().toString().length() - 1) {
            vals.add(Double.parseDouble(val));
        }
    

    您在val中从String收集所有数字,在+-*/处停止忽略所有其他字符,它们不会落入任何else中,因此只会导致无操作和循环前进。输入5.5+1会发生什么情况

    • 5被添加到val
    • .被忽略
    • 5被添加到val:现在是55
    • +"55"被解析为vals[0] = 55"+"被放入signs[0]
    • 1被添加到val,代码检测到它是字符串的结尾,因此它将"1"解析为vals[1] = 1

    代码的其余部分愉快地计算55 + 1,您永远不会发现

    撇开代码的有效性不谈,您应该

    1. 将条件更改为

      if (Character.isDigit(inputText.getText().toString().charAt(i))
          || inputText.getText().toString().charAt(i) == '.') {
      
    2. 添加最后一个else,将任何漏接字符报告为警告或错误

  2. # 2 楼答案

    您可以使用ScriptEngine

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    Object result = engine.eval(editText1.getText().toString());
    editText1.setText(result.toString());