【问题标题】:Subtracting method returning wrong answer减法返回错误答案
【发布时间】:2013-05-23 23:19:04
【问题描述】:

由于某种原因,当我在这里测试我的“100-50-40”时,我得到的是“60”而不是“10”。所有其他组合都有效,例如“10+20”和“40-20”。当我尝试连续减去多个数字时会出现问题。有什么想法吗?

public double add(String exp){
        String left = "";
        String right = "";
        double leftValue = 0;
        double rightValue = 0;
        double answer = 0;

    for(int i=0;i<exp.length();i++)
    {
        if(exp.charAt(i)=='+')
        {
            right = exp.substring(i+1, exp.length());
            leftValue = subtract(left);
            rightValue = add(right);
            answer = leftValue + rightValue;
            return answer;
        }   
        else
        {
            left = left + exp.substring(i,(i+1));

        }
    } // End for loop
    answer = subtract(exp);
    return answer;

} // End add method

//guaranteed there are no addition operators in exp 
public double subtract(String exp){
    String left = "";
    String right = "";
    double leftValue = 0;
    double rightValue = 0;
    double answer = 0;

    for(int i=0;i<exp.length();i++)
    {
        if(exp.charAt(i)=='-')
        {
            right = exp.substring(i+1, exp.length());
            leftValue = Double.parseDouble(left);
            rightValue = subtract(right);
            answer = leftValue - rightValue;
            return answer;
        }   
        else
        {
            left = left + exp.substring(i,(i+1));
        }
    } // End for loop
    answer = Double.parseDouble(exp);
    return answer;
}

【问题讨论】:

  • 对不起,我是这个意思
  • 我得到90 for 100-50-40 - 给定你的算法 - 似乎是预期值?!请注意,您的算法计算 100-(50-40),而不是像人们预期的那样计算 (100-50)-40

标签: java methods add subtraction


【解决方案1】:

您得到 90,因为您在从 100 中减去结果之前评估了 50-40。

在这段代码中,您将表达式除以第一个减号:

        right = exp.substring(i+1, exp.length());
        leftValue = Double.parseDouble(left);
        rightValue = subtract(right);
        answer = leftValue - rightValue;

rightValue 为“50-40”,leftValue 为 100。

您可以通过查找 last 减号来解决这种特殊情况。

也就是说,如果您最终希望使用其他运算符和分组来处理更复杂的表达式,您可能会发现阅读更多有关手写recursive-descent parsers 或使用parser generators 的信息会很有用。使用解析器生成器,您可以指定所需的语法,该工具会构建代码来为您解析它。我自己最喜欢的 Java 解析器生成器是 Antlr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2015-08-20
    • 1970-01-01
    • 2018-10-03
    • 2014-12-04
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多