使用readline-sync执行基础运算时加减功能异常,求排查方案
问题原因与解决方案
嘿,这个问题我太熟啦!你遇到的问题根源其实很简单:readlineSync.question()方法返回的是字符串类型,而不是数字类型。
为什么乘除正常,加减出问题?
- 乘法(
*)和除法(/)运算符在JavaScript中会自动尝试将字符串转换为数字进行计算,所以即使输入是字符串,"5" * "3"也会被解析成5 * 3 = 15,除法同理。 - 加法(
+)比较特殊:它既可以做数字加法,也可以做字符串拼接。当两个操作数都是字符串时,JavaScript会默认执行拼接操作,所以"5" + "3"会变成"53"而不是8。 - 减法(
-)虽然也会尝试转换类型,但如果输入的字符串无法被解析为有效数字(比如包含非数字字符),就会返回NaN;即使输入是纯数字字符串,显式转换类型也是更稳妥的做法。
修复代码的方法
只需要把用户输入的字符串显式转换为数字即可,推荐用parseFloat()(支持小数)或者Number()函数:
var readlineSync = require("readline-sync"); // 将输入转换为数字类型 var enterNum1 = parseFloat(readlineSync.question("Please enter your first number: ")); var enterNum2 = parseFloat(readlineSync.question("Please enter your second number: ")); var operations = ["add", "sub", "mul", "div"]; var selectOperation = readlineSync.keyInSelect(operations, "Please select an operation: "); switch(selectOperation) { case 0: console.log(`Result: ${enterNum1 + enterNum2}`); break; case 1: console.log(`Result: ${enterNum1 - enterNum2}`); break; case 2: console.log(`Result: ${enterNum1 * enterNum2}`); break; case 3: console.log(`Result: ${enterNum1 / enterNum2}`); break; default: console.log("Operation cancelled"); }
进阶优化:添加输入验证
为了防止用户输入非数字内容导致错误,可以加一个简单的输入验证函数:
var readlineSync = require("readline-sync"); function getValidNumber(prompt) { let num; do { num = parseFloat(readlineSync.question(prompt)); if (isNaN(num)) { console.log("Oops, please enter a valid number!"); } } while (isNaN(num)); return num; } var enterNum1 = getValidNumber("Please enter your first number: "); var enterNum2 = getValidNumber("Please enter your second number: "); // 后续运算逻辑和上面一致
这样就能确保输入的都是有效数字,彻底避免NaN和字符串拼接的问题啦!
内容的提问来源于stack exchange,提问作者Christian Lopez
相关产品推荐
相关产品推荐

