如何让函数返回大数的原始形式而非指数形式?
解决大数字阶乘无法返回原始形式长度的问题
你的问题核心在于JavaScript Number类型的精度限制以及超大数字的科学计数法转换缺陷:
- Number仅能精确表示到2^53-1(即9007199254740991),超出这个范围的整数会丢失精度,还会自动转为科学计数法存储
toLocaleString处理超出精度范围的Number时,会出现返回异常值(比如你遇到的返回1)的情况
正确解决方案:用BigInt处理大整数计算
BigInt可以精确表示任意大小的整数,不会出现精度丢失或自动转科学计数法的问题,直接转字符串就能获取原始形式的长度。
修改后的代码如下:
function count(n) { let numbers = []; // 将初始值转为BigInt类型 let bigN = BigInt(n); do { numbers.push(bigN); bigN--; } while (bigN > 0n); // 用BigInt完成阶乘计算,初始累加值设为1n(BigInt类型的1) const factorial = numbers.reduce((accumulator, currentValue) => accumulator * currentValue, 1n); // 直接转为字符串获取长度 return factorial.toString().length; } console.log(count(20)); // 输出19,对应20!的位数 console.log(count(100)); // 可正确输出158,即100!的位数
原方法失效的原因
当n超过20时,21!的结果(51090942171709440000)已经超出Number的安全整数范围,此时用Number计算的阶乘是不精确的近似值,且会以科学计数法存储。toLocaleString无法正确解析这种超出精度的科学计数法数字,因此返回错误结果。
内容的提问来源于stack exchange,提问作者user22362540
相关产品推荐
相关产品推荐

