本文详解如何将用户输入的二进制字符串转换为十进制整数,并进一步计算该十进制数各位数字的平方和(如 38 → 3² + 8² = 9 + 64 = 73),重点纠正原始代码中 Math.pow(sNumber, 2) 的误用,提供简洁、健壮的实现方案。
本文详解如何将用户输入的二进制字符串转换为十进制整数,并进一步计算该十进制数**各位数字的平方和**(如 38 → 3² + 8² = 9 + 64 = 73),重点纠正原始代码中 `math.pow(snumber, 2)` 的误用,提供简洁、健壮的实现方案。
在 JavaScript 中,将二进制字符串转换为十进制数是常见需求,但后续若需对结果的
每一位数字单独处理
(例如求各位数字的平方和),关键在于正确地“拆解”数字——不能直接对整个字符串调用 Math.pow(),而应先转为字符串、再逐字符解析为数字。
原始代码中存在一个核心错误:
这会导致逻辑完全偏离目标(本意是 3² + 8²,却算成了 38²)。
✅ 正确做法是:将十进制结果转为字符串 → 拆分为字符数组 → 使用 reduce() 累加每个字符转为数字后的平方值。优化后的 squareIt 函数如下:
该写法简洁、函数式、无副作用。Number(char) ** 2 是 Math.pow(Number(char), 2) 的现代等价写法,更直观;初始值 0 确保空输入返回 0。
完整可运行示例:
⚠️ 注意事项:
输入校验未包含在示例中,实际项目中建议添加:检查 binary 是否为空、是否只含 '0' 和 '1';
prompt() 返回字符串,Number(binary[i]) 可安全处理 '0'/'1',但若用户输入非法字符(如 '2'),结果将为 NaN,建议增加 isNaN() 判断;
对于大数,toString() 仍可靠;若需支持科学计数法表示的数字(如 1e21),应先用 String(decimal) 并正则清洗,但本场景(二进制转换)通常不涉及。
总结:数字各位运算的本质是「字符串化 → 遍历 → 数字化 → 计算」。掌握 split('') 与 reduce() 的组合,能高效、可读地实现各类数位级处理逻辑。
total += Number(sNumber.charAt(i)) * Math.pow(sNumber, 2); // ❌ 错误!sNumber 是字符串,Math.pow("38", 2) 会尝试将字符串转为数字后平方,导致计算的是 38²=1444,而非各位平方function squareIt(decimal) {
return decimal.toString()
.split('') // 转字符串后分割为 ['3', '8']
.reduce((sum, char) => sum + Number(char) ** 2, 0); // 每位转数、平方、累加
}let binary = prompt("Write a Binary Number");
function binaryToDecimalConverter(binary) {
let decimal = 0;
let power = 0;
for (let i = binary.length - 1; i >= 0; i--) {
decimal += Number(binary[i]) * (2 ** power); // 用 ** 替代 Math.pow 更简洁
power++;
}
console.log("Decimal: " + decimal);
console.log("Sum of squares of digits:", squareIt(decimal));
}
function squareIt(decimal) {
return decimal.toString()
.split('')
.reduce((sum, digit) => sum + Number(digit) ** 2, 0);
}
binaryToDecimalConverter(binary);