使用JS开发仿iOS计算器时无法正确存储第二个操作数求助
问题根因
你当前的代码存在两个核心问题:
getnum函数中存储第一个数字的firstnum是局部变量,函数执行后就会销毁,外部逻辑无法读取到该值- 运算逻辑执行前没有读取当前屏幕输入的第二个操作数,始终复用了存储的第一个操作数
numinmem参与计算,因此出现两个运算数数值相同的问题
修复方案
1. 改造数字读取函数
修改getnum函数,直接返回当前屏幕的数值供外部逻辑调用:
const getnum = () => { return parseFloat(ans.innerText || 0); };
2. 修改运算符处理逻辑
在运算符触发时先读取当前屏幕的数值作为操作数,已有存储的第一个数时先执行运算再更新状态:
operationperf = (operation) => { const currentNum = getnum(); // 注意numinmem初始值要设为undefined,避免0等有效数值被误判 if (numinmem === undefined) { numinmem = currentNum; operatorinmem = operation; ans.textContent = ""; return; } // 用存储的第一个数、当前读取的第二个数执行上一次的运算符运算 numinmem = getResultOfOperationAsStr(numinmem, currentNum, operatorinmem); operatorinmem = operation; ans.textContent = ""; };
3. 改造运算执行函数
让运算函数接收明确的两个操作数和运算符参数,避免内部读取错误的数值:
const getResultOfOperationAsStr = (firstNum, secondNum, operator) => { let result; switch(operator) { case '+': result = firstNum + secondNum; break; case '-': result = firstNum - secondNum; break; case '×': result = firstNum * secondNum; break; case '÷': result = firstNum / secondNum; break; default: return secondNum; } // 处理浮点精度问题,可按需调整保留位数 return parseFloat(result.toFixed(10)); };
4. 补全等号点击逻辑
按等号时读取第二个操作数完成运算,重置状态方便后续新计算:
// 绑定等号按钮点击事件,如果你已有等号逻辑对应修改即可 equalButton.addEventListener('click', () => { if (numinmem === undefined || operatorinmem === undefined) return; const secondNum = getnum(); const finalResult = getResultOfOperationAsStr(numinmem, secondNum, operatorinmem); ans.textContent = finalResult; // 重置存储状态 numinmem = undefined; operatorinmem = undefined; });
额外注意事项
全局变量numinmem初始值要设置为undefined,不要设为0,否则输入0 + 10这类以0开头的计算时,会误判没有存储第一个操作数导致逻辑错误。
内容的提问来源于stack exchange,提问作者Kartic Joshi
相关产品推荐
相关产品推荐

