如何在 JavaScript 中从 BigInt 中获取数字?

S. *_*ain 7 javascript bigint

我正在研究项目 Euler Problem 104的问题 n\xc2\xb0104并想用 javascript 来完成。

\n\n

为了解决这个问题,我需要计算斐波那契序列的大值,但是这个序列产生的数字太大,无法用经典的 Number 处理,所以我使用最新版本的 javascript 支持的 BigInt。

\n\n

一旦我将特定结果存储在 BigInt 中,我需要检查它的前 10 位和最后一位数字。

\n\n
\n\n

为了从 Number 中获取数字,我们通常会执行如下代码所示的操作,但是当数字变得非常大时,就会出现问题:

\n\n

\r\n
\r\n
let number = BigInt(123456789)\r\nconsole.log(number.toString())\r\nconsole.log(number.toString()[3]) // Result is fine\r\n\r\nlet bigNumber = BigInt(1234567891111111111111111111111111111)\r\nconsole.log(bigNumber.toString())\r\nconsole.log(bigNumber.toString()[30]) // unpredictable result
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

似乎“toString()”方法仅使用 Number 类型的精度(我相信是 2^53),因此我们很快就会失去 BigInt 数字最后一位数字的精度。问题是我找不到其他方法来提取这些数字。

\n\n

编辑: \n我需要完美的精度,因为基本上我正在做的事情是:

\n\n

计算斐波那契(500) = 280571172992510140037611932413038677189525

\n\n

获取该数字的最后 10 位数字:8677189525(这是丢失精度的地方)

\n\n

然后为了解决我的问题,我需要检查最后 10 位数字是否包含从 1 到 9 的所有数字

\n

Aus*_*eco 5

对于大数字,我认为你应该添加后缀n

let number = BigInt(123456789)
console.log(number.toString())
console.log(number.toString()[3]) // Result is fine

let bigNumber = 1234567891111111111111111111111111111n // <-- n suffix, literal syntax
console.log(bigNumber.toString())
console.log(bigNumber.toString()[30]) // result

let bigNumber2 = BigInt('1234567891111111111111111111111111111') // <-- also works as a string, in case you can't use the literal for some reason 
console.log(bigNumber2.toString())
console.log(bigNumber2.toString()[30]) // result
Run Code Online (Sandbox Code Playgroud)