【问题标题】:Why does appending n to a number (to create a BigInt) result in an error?为什么将 n 附加到数字(以创建 BigInt)会导致错误?
【发布时间】:2021-07-21 03:41:34
【问题描述】:

我正在编写一个程序来返回斐波那契数列中具有给定数字长度的第一个数字的索引。

将 n 附加到函数调用中的数字会导致以下结果:

let fibIdxByLength = (length) => {
  let [ cur, next ] = [ 1n, 1n ];
  let idx = 2n;
  while (next < (10 ** (length - 1))) {
    [ cur, next ] = [ next, cur + next ];
    idx++;
  }
  return idx;
};

fibIdxByLength(2n) === 7n; // 1 1 2 3 5 8 13
fibIdxByLength(3n)  === 12n;  // 1 1 2 3 5 8 13 21 34 55 89 144
fibIdxByLength(10n) === 45n;
fibIdxByLength(16n) === 74n;
fibIdxByLength(100n) === 476n;
fibIdxByLength(10000n) === 4782n;

这导致:标识符直接在数字之后,程序将无法运行

我也尝试过使用 BigInt(),但它说 BigInt 未定义。

有什么想法吗?

【问题讨论】:

  • 错误信息相当清楚。特别是如果你查一下。 BigInt 和普通数字不兼容 length - 1 是不允许的操作。 length - 1n 是。您需要确保只对 BigInts 或普通数字进行操作,而不是两者的混合。
  • 注解:为什么要反复重新计算10**(length-1)

标签: javascript bigint


【解决方案1】:

如果BigInt 未定义,那么您的浏览器太旧了。检查 caniuse.com/bigint 以获取支持 BigInts 的浏览器(简而言之:自 2018 年起的 Chrome 和 Opera,自 2019 年起的 Firefox,自 2020 年起的 Safari 和 Edge)。

【讨论】:

    【解决方案2】:

    我不确定为什么 BigInt() 不起作用(当我在 Chrome 控制台中运行和调试它时,它至少对我有用,它告诉我它不喜欢你做的时候(长度 - 1). 这是因为 length 是 BigInt 类型,而 1 是普通整数类型。10 也是如此。我将它们都设为 BigInt 类型,它似乎可以工作。

    let fibIdxByLength = (length) => {
      let [ cur, next ] = [ 1n, 1n ];
      let idx = 2n;
      while (next < (10n ** (length - 1n))) {
        [ cur, next ] = [ next, cur + next ];
        idx++;
      }
      return idx;
    };
    
    fibIdxByLength(2n) === 7n; // 1 1 2 3 5 8 13
    fibIdxByLength(3n)  === 12n;  // 1 1 2 3 5 8 13 21 34 55 89 144
    fibIdxByLength(10n) === 45n;
    fibIdxByLength(16n) === 74n;
    fibIdxByLength(100n) === 476n;
    fibIdxByLength(10000n) === 4782n;

    【讨论】:

    • "我不知道为什么 BigInt() 不起作用" 因为您不能同时对 BigInt 和普通数字进行操作。该操作不安全、有损且容易出错 - 例如,0.5 * 1n 会产生什么?一个大整数?普通号?如果它是 BigInt,那么它不能是没有一半概念的东西的“一半”。如果是正常号码,你会留下吗?四舍五入到最接近的整数?最接近的整数是多少?当您开始超出正常数字安全值的范围时,情况会更加复杂。
    • 我进行了您建议的更改,但仍然遇到相同的错误。即使我注释掉所有代码并简单地输入如下内容:let x=2n,它也会产生相同的错误。会不会是 VScode 中的东西?
    • VLAZ,我的意思是 BigInt() 为我工作,正如你所说,我将代码修改为仅使用 BigInt 类型。无论如何,JavaScript 不能避免有损和容易出错:P 大卫,我认为这可能是一个 VSCode 问题。 Chrome 的控制台允许 BigInt() / 3n 等。我认为 VSCode 的解析器无法识别它。这是一个相关的线程:github.com/microsoft/vscode/issues/95187
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多