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

React实现的JavaScript计算器连续运算符处理逻辑问题求助

React实现的JavaScript计算器连续运算符处理逻辑问题求助

嘿,我最近用JS/React做了个计算器,但卡在了连续运算符的处理逻辑上,想请大家帮忙看看怎么调整!

我想要实现的效果是:当连续输入2个及以上运算符时,除了负号(-)之外,最终执行的操作要以最后输入的那个运算符为准。举两个具体例子:

  • 2*-9应该计算得到-18(这里的负号是用来表示负数,不属于连续运算符范畴)
  • 12*-/3应该计算得到4(这里最后输入的运算符是/,所以实际执行的是12/3)

另外还有个奇怪的小bug:当我输入5*-的时候,还没来得及输入第二个操作数,它就自动变成5*5了,完全不符合预期。

下面是我的代码片段:

const { useState } = React;

function Calculator() {
  const [displayValue, setDisplayValue] = useState('0');
  const [firstOperand, setFirstOperand] = useState(null);
  const [operator, setOperator] = useState(null);
  const [waitingForSecondOperand, setWaitingForSecondOperand] = useState(false);

  const inputDigit = (digit) => {
    if (waitingForSecondOperand) {
      setDisplayValue(String(digit));
      setWaitingForSecondOperand(false);
    } else {
      setDisplayValue(displayValue === '0' ? String(digit) : displayValue + digit);
    }
  };

  const inputDecimal = () => {
    if (!displayValue.includes('.')) {
      setDisplayValue(displayValue + '.');
    }
  };

  // 这里的运算符处理逻辑有问题,导致连续运算符和负号的情况没处理好
  const inputOperator = (nextOperator) => {
    const inputValue = parseFloat(displayValue);

    if (firstOperand === null) {
      setFirstOperand(inputValue);
    } else if (operator) {
      const result = calculate(firstOperand, inputValue, operator);
      setDisplayValue(String(result));
      setFirstOperand(result);
    }

    setWaitingForSecondOperand(true);
    setOperator(nextOperator);
  };

  const calculate = (first, second, op) => {
    switch (op) {
      case '+':
        return first + second;
      case '-':
        return first - second;
      case '*':
        return first * second;
      case '/':
        return first / second;
      default:
        return second;
    }
  };

  return (
    <div className="calculator">
      <div className="display">{displayValue}</div>
      <div className="buttons">
        <button onClick={() => inputDigit('7')}>7</button>
        <button onClick={() => inputDigit('8')}>8</button>
        <button onClick={() => inputDigit('9')}>9</button>
        <button onClick={() => inputOperator('/')}>/</button>
        <button onClick={() => inputDigit('4')}>4</button>
        <button onClick={() => inputDigit('5')}>5</button>
        <button onClick={() => inputDigit('6')}>6</button>
        <button onClick={() => inputOperator('*')}>*</button>
        <button onClick={() => inputDigit('1')}>1</button>
        <button onClick={() => inputDigit('2')}>2</button>
        <button onClick={() => inputDigit('3')}>3</button>
        <button onClick={() => inputOperator('-')}>-</button>
        <button onClick={() => inputDigit('0')}>0</button>
        <button onClick={() => inputDecimal()}>.</button>
        <button onClick={() => inputOperator('=')}>=</button>
        <button onClick={() => inputOperator('+')}>+</button>
      </div>
    </div>
  );
}

ReactDOM.render(<Calculator />, document.getElementById('root'));

有没有大佬能帮我调整inputOperator函数的逻辑,解决这两个问题呀?

备注:内容来源于stack exchange,提问作者tigertiger_74

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:14:34