我正在研究项目 Euler Problem 104的问题 n\xc2\xb0104并想用 javascript 来完成。
\n\n为了解决这个问题,我需要计算斐波那契序列的大值,但是这个序列产生的数字太大,无法用经典的 Number 处理,所以我使用最新版本的 javascript 支持的 BigInt。
\n\n一旦我将特定结果存储在 BigInt 中,我需要检查它的前 10 位和最后一位数字。
\n\n为了从 Number 中获取数字,我们通常会执行如下代码所示的操作,但是当数字变得非常大时,就会出现问题:
\n\nlet 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 resultRun Code Online (Sandbox Code Playgroud)\r\n似乎“toString()”方法仅使用 Number 类型的精度(我相信是 2^53),因此我们很快就会失去 BigInt 数字最后一位数字的精度。问题是我找不到其他方法来提取这些数字。
\n\n编辑: \n我需要完美的精度,因为基本上我正在做的事情是:
\n\n计算斐波那契(500) = 280571172992510140037611932413038677189525
\n\n获取该数字的最后 10 位数字:8677189525(这是丢失精度的地方)
\n\n然后为了解决我的问题,我需要检查最后 10 位数字是否包含从 1 到 9 的所有数字
\n对于大数字,我认为你应该添加后缀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]) // resultRun Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1188 次 |
| 最近记录: |