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

如何让函数返回大数的原始形式而非指数形式?

解决大数字阶乘无法返回原始形式长度的问题

你的问题核心在于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:57:35