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
相关产品推荐
相关产品推荐

