首页 > 解决方案 > 如何从 javascript 中的 BigInt 获取数字?

问题描述

我正在处理项目 Euler Problem 104的问题 n°104,并希望用 javascript 来完成。

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

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


要从 Number 中获取数字,我们通常会在下面的代码中执行类似的操作,但是当数字变得非常大时,就会出错:

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

let bigNumber = BigInt(1234567891111111111111111111111111111)
console.log(bigNumber.toString())
console.log(bigNumber.toString()[30]) // unpredictable result

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

编辑: 我需要完美的精度,因为我所做的基本上是:

计算斐波那契 (500) = 280571172992510140037611932413038677189525

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

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

标签: javascriptbigint

解决方案


对于大数字,我认为您应该添加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


推荐阅读