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

Java分数运算优先级处理问题求助:结果与预期不符

Java分数运算BEDMAS规则错误排查

正在完成一项Java作业,需要实现用户输入分数及运算符(输入"quit"停止程序),处理如1/2 + 1/4 * 1/6 - 2/7这类遵循BEDMAS规则的分数运算。预期结果为43/168,但运行程序后得到26/48。以下是实现思路、输入示例、main类及Fraction类代码,恳请帮忙排查错误原因。

输入示例

Enter numerator: 1
Enter denominator: 2
Enter operation: +

Enter numerator: 1
Enter denominator: 4
Enter operation: *

Enter numerator: 1
Enter denominator: 6
Enter operation: -

Enter numerator: 2
Enter denominator: 7
Enter operation: quit

实现思路

为处理BEDMAS问题,采用5个对象的方式。以1 + 2 × 3 + 4 × 5为例:

  • 查看前3个分数,若运算符为×或/则执行运算,得到1 + 6 + 4 × 5;
  • 再次查看前3个分数,无×/则先运算前两个,得到7 + 4 × 5;
  • 查看前3个分数,存在×则执行运算,得到7 + 20;
  • 若剩余元素少于3个,完成运算得到27。

main类代码

public class app {
    static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) throws Exception {
        System.out.println("Hello, World!");
        Fraction f1 = null;
        Fraction f2 = null;
        Fraction f3 = null;
        Fraction result = null;
        boolean stop = false;
        String op1 = "", op2 = "";
        while (!stop) {
            System.out.println("input fraction: ");
            Fraction f = Fraction.inputNewFraction();
            result = f;
            if (f1 == null) {
                f1 = f;
            } else {
                if (f2 == null) {
                    f2 = f;
                } else {
                    f3 = f;
                }
            }
            scan.nextLine();
            System.out.print("input operation:");
            String s = scan.nextLine();
            // System.out.print(s.equals("+"));
            if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
                if (f2 == null) {
                    op1 = s;
                } else {
                    if (f3 == null) {
                        op2 = s;
                    } else if (f3 != null) {
                        if (op1 == "+" || op1 == "-") {       // check: CORRECT
                            f1 = f1.opCal(f2, op1);
                            f2 = f3;
                            op1 = op2;

                        } else {
                            f2 = f2.opCal(f3, op2);                            
                        }
                        
                        f3 = null;
                        op2 = s;

                    }
                }
            } else {
                stop = true;

            }
            System.out.println("f1: " + f1.toString());
            if (f2 != null)
                System.out.println("f2: " + f2.toString());
            if (f3 != null)
                System.out.println("f3: " + f3.toString());
                System.out.println("result: " + result.toString());
            if (f2 != null) {
                result = f1.opCal(f2, op1);
                System.out.println("result: " + result.toString());
            }
        }
    }  
}

Fraction类代码

class Fraction {
  
  private int numerator;
  private int denominator;

  public Fraction(int myNumerator, int myDenominator) {   // constructor Fraction now holds numerator, 
    numerator = myNumerator;                              // and denominator at the same time
    denominator = myDenominator;
  }

  public Fraction opCal(Fraction fraction, String promptOperation) {
    int newNumerator;
    int newDenominator;

    switch (promptOperation) {
      case "+":
        newNumerator = (numerator * fraction.denominator) + (fraction.numerator * denominator);
        newDenominator = denominator * fraction.denominator;
        return new Fraction(newNumerator, newDenominator);
      case "-":
        newNumerator = (numerator * fraction.denominator) - (fraction.numerator * denominator);
        newDenominator = denominator * fraction.denominator;
        return new Fraction(newNumerator, newDenominator);
      case "*":
        newNumerator = numerator * fraction.numerator;
        newDenominator = denominator * fraction.denominator;
        return new Fraction(newNumerator, newDenominator);
      case "/":
        newNumerator = numerator * fraction.denominator;
        newDenominator = denominator * fraction.numerator;
        return new Fraction(newNumerator, newDenominator);
      default:
        System.out.println("Invalid operator");
        return new Fraction(0, 0); // Return a default Fraction object
    }
  }

  public static Fraction inputNewFraction() throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter numerator:");
        int a = scan.nextInt();
        System.out.print("Enter denominator:");
        int b = scan.nextInt();
        return new Fraction(a, b);
    }
 
  public String toString() {
    return numerator +  " / " + denominator;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:37:46