修改Java计算器使其支持负数输入的技术求助
Java计算器负数输入问题修复
你的计算器能处理四则运算优先级,但对2 * -2这类运算符后接负数的场景处理错误,返回4而非正确的-4,而(-2 * 2)这种括号包裹的负数能正常计算。问题出在原代码对前置负号的判断逻辑有漏洞,以下是修复方案:
问题根源
原代码仅在isNewNumber为true时处理负号,但遇到*//这类运算符后,isNewNumber会被设为false,此时再遇到负号,不会触发负号逻辑,导致负数被当成正数计算。
修复后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a math expression: "); String expression = scanner.nextLine(); double result = 0; double currentNumber = 0; double multiplier = 1; boolean isNewNumber = true; boolean hasDecimal = false; double decimalMultiplier = 0.1; for (int i = 0; i < expression.length(); i++) { String currentSymbol = expression.substring(i, i + 1); if ("0123456789".indexOf(currentSymbol) != -1) { if (hasDecimal) { currentNumber = currentNumber + Double.parseDouble(currentSymbol) * decimalMultiplier; decimalMultiplier /= 10; } else { currentNumber = currentNumber * 10 + Double.parseDouble(currentSymbol); } isNewNumber = true; } else if (currentSymbol.equals(".")) { hasDecimal = true; } else if ("+-*/".indexOf(currentSymbol) != -1) { // 优先处理前置负号(表达式开头或前一个字符是运算符) if (currentSymbol.equals("-") && (i == 0 || "+-*/".indexOf(expression.substring(i - 1, i)) != -1)) { multiplier = -1; isNewNumber = true; continue; // 跳过后续常规运算符处理逻辑 } if (isNewNumber) { if (currentSymbol.equals("+")) { result += currentNumber * multiplier; multiplier = 1; } else if (currentSymbol.equals("-")) { result += currentNumber * multiplier; multiplier = -1; } else if (currentSymbol.equals("*")) { multiplier *= currentNumber; } else if (currentSymbol.equals("/")) { multiplier /= currentNumber; } currentNumber = 0; isNewNumber = false; hasDecimal = false; decimalMultiplier = 0.1; } } } result += currentNumber * multiplier; System.out.println("Result: " + result); } }
关键修改说明
- 前置负号优先判断:在运算符处理逻辑最开头,先识别属于"负号"而非"减号"的场景(表达式开头或前一个字符是其他运算符),直接设置
multiplier = -1并标记新数字状态,确保后续输入的数字会被转为负数。 - 重置加法后的乘数:原代码处理
+运算符时未重置multiplier为1,导致之前的负号会被继承,现在补充了重置逻辑,避免影响后续计算。 - 统一数字输入后的状态标记:把
isNewNumber = true移到数字处理逻辑的最后,无论输入整数还是小数,只要输入数字就标记为新数字状态,保证运算符能正确触发计算。
测试2 * -2会正确返回-4,(-2 * 2)也能正常返回-4,同时不破坏原有四则运算的优先级逻辑。
内容的提问来源于stack exchange,提问作者star.rei
相关产品推荐
相关产品推荐

