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

Vanilla JS计算器含负数运算返回NaN问题求助

解决Vanilla JS计算器负数运算返回NaN的问题

核心问题定位

你的推测完全正确,问题根源就在表达式拆分为数字和操作符的逻辑上。常规的拆分正则会把负数的负号误判为独立操作符,导致拆分出无效的空片段或错误数字,最终计算时触发NaN。比如-3+5会被拆成['', '-', '3', '+', '5'],空字符串转数字直接就是NaN。

修正方案:适配负数的正则拆分

替换原来的拆分逻辑,用以下正则提取数字和操作符,能正确识别开头的负数、操作符后的负数(如3*-2):

const expr = "-4+6*-2"; // 示例表达式
const tokens = expr.match(/(-?\d+\.?\d*)|([+\-*/])/g).filter(token => token.trim() !== '');

正则逻辑解释

  • -?\d+\.?\d*:匹配数字片段,-?表示可选负号(仅匹配表达式开头或操作符后的负号,避免误判),\d+匹配整数部分,\.?\d*匹配可选小数部分;
  • ([+\-*/]):单独匹配加减乘除操作符;
  • match(...)全局提取所有符合规则的片段,filter(...)过滤可能出现的空字符串(比如表达式带空格的情况)。

代码调整示例

假设你原本的拆分逻辑是这样的错误写法:

// 错误拆分:会把负号单独拆分
const tokens = expr.split(/([+\-*/])/);

直接替换为上面的match+filter逻辑即可。

验证关键场景

  • 单次负数运算:-10*2 → 拆分结果['-10', '*', '2'],计算得-20;
  • 含负数的连续运算:5+-3/2 → 拆分结果['5', '+', '-3', '/', '2'],计算得3.5;
  • 开头负数的连续运算:-4+6*-2 → 拆分结果['-4', '+', '6', '*', '-2'],计算得-16。

额外优化提示

  • 如果计算器支持括号,更新正则为/(-?\d+\.?\d*)|([+\-*/()])/g即可兼容;
  • 拆分前先清理表达式中的空格:expr = expr.replace(/\s+/g, ''),避免空格干扰匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:20:42