【问题标题】:I am learning to use android studio to make an app, so I am making a simple calculator, but I have run into a problem getting the correct answer我正在学习使用 android studio 制作应用程序,所以我正在制作一个简单的计算器,但我遇到了获得正确答案的问题
【发布时间】:2020-02-17 02:51:00
【问题描述】:

我已经尝试了几件事来让它工作,但它返回的答案是非常错误的。例如,它返回 1+2 = 99.0 和 1*2 = 2450.0 等。所有按钮都可以工作,我认为 main 方法很好。下面是我在单击等号按钮时将 TextView 中的 CharSequence 转换为 String 的方式。

Button btnEquals = (Button)findViewById(R.id.btnEquals);
    btnEquals.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            String problem = textDisplay.getText().toString();
            double intermediate = evalProblem(problem);
            String answer = "" + intermediate;

            textDisplay.setText(answer);

        }
    });

这是我为计算方程而调用的方法。

public static Double evalProblem(String s) {
    double output;
    double mult = 0.0;
    double add = 0.0;
    double sub = 0.0;
    double div = 0.0;

    if (s.contains("*")) {
        int x = s.indexOf("*");
        mult = s.charAt(x-1)*s.charAt(x+1);
    }
    if (s.contains("/")) {
        int x = s.indexOf("/");
        div = s.charAt(x - 1) / s.charAt(x + 1);
    }
    if (s.contains("+")) {
        int x = s.indexOf(("+"));
        add = s.charAt(x-1) + s.charAt(x+1);
    }
    if (s.contains("-")) {
        int x = s.indexOf("-");
        sub = s.charAt(x - 1) - s.charAt(x + 1);
    }


    output = mult + add + sub + div;
    return output;
}

【问题讨论】:

    标签: java android calculator


    【解决方案1】:

    .charAt() 返回一个字符,而不是一个整数。例如,“8*8”有 3 个字符 - '8'、'*' 和 '8'。当您对字符执行数学运算时,它使用字符的 ASCII 值,例如:'A' 的 ASCII 值为 65。'0' 的值为 48。

    因此,'1' + '2' = 49 + 50 = 99

    您需要将“*”之前的字符串部分转换为数字,对吗? Java 有一个简单的解决方案:Double.parseDouble() 方法:

    String text = "567";
    int number = Double.parseDouble(text);
    

    要解决您的特定问题,您应该试试这个:

    int x = s.indexOf('*');
    mult = Double.parseDouble(s.substring(0, x)) * Double.parseDouble(s.substring(x+1));
    

    此解决方案的最佳之处在于,您可以使用多于一位的数字,因为代码会将 s 中“*”之前和之后的所有内容都转换为数字。

    编辑:正如 u/markspace 在下面的评论中提到的,您应该考虑使用 Java 中的内置解析库,如下所示:Algebra equation parser for java

    编辑 2: 我曾建议使用 Integer.parseInt() 将字符串转换为数字,但正如 u/MartinZeitler 在下面的评论中指出的那样,使用 Double.parseDouble() 转换为双精度值会更好。

    【讨论】:

    • 编写一个正确的代数解析器对于 OP 来说是一个更正确的解决方案。 stackoverflow.com/questions/4681959/…
    • @markspace 指出得很好,我将编辑我的答案以反映这一点。
    • 使用Integer 作为计算器的例子是有问题的; DoubleBigDecimal 可能是合适的数据类型。
    猜你喜欢
    • 2021-03-16
    • 2021-05-26
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多