如何在JavaScript中将字符串转换为大整数

33

我需要将一个字符串转换成类似于JavaScript中的BigInteger的BigInt。

示例:

var reqId = "78099864177253771992779766288266836166272662";
var result = parseInt(reqId);
document.write(result);

由于JavaScript只允许整数最大为(2^53)-1,因此导致结果值不匹配。

有没有什么方法可以解决这个问题?


2
JavaScript本身没有“BigInteger”这样的东西。有一些可用于执行无限精度定点数学运算的包。所有JavaScript数字都是64位浮点值。 - Pointy
我这里看不到Java... 你为什么把它标记为Java问题?? - ΦXocę 웃 Пepeúpa ツ
如何使用其他软件包进行无限精度计算,你有什么想法吗? - rselvaganesh
BigInteger与Java相关...我想问的是,在JavaScript中是否有类似的实现方式! - rselvaganesh
4个回答

58

BigInt现在是JavaScript的本地语言特性。它已经通过TC39进程的Stage 3,并且正在V8 v6.7和Chrome 67中使用。

要将包含有效数字文字的字符串转换为BigInt,请使用全局BigInt函数:

const string = '78099864177253771992779766288266836166272662';
BigInt(string);
// 78099864177253771992779766288266836166272662n

如果您只想将数字值硬编码到代码中,无需从字符串转换,可以使用BigInt字面量:

const value = 78099864177253771992779766288266836166272662n;

1
我不建议使用BigInt原语,因为我认为目前只有Chrome浏览器/环境支持它们。因此,我建议等待它变得更加普遍兼容再使用。 - IceMetalPunk
事实上,在其他浏览器支持 BigInt 之前,我建议使用 JSBI 作为符合规范的 polyfill 实现。一旦 BigInt 得到普遍支持,您可以使用我们的转译器将 JSBI 代码转换为本地 BigInt 代码。更多信息请参见:https://developers.google.com/web/updates/2018/05/bigint#polyfilling_and_transpiling_bigints - Mathias Bynens
1
BigInt(78099864177253771992779766288266836166272662) 返回 78099864177253773769881977469241629459087360n。它们不相同。 - Centell
4
@Centell,这是因为您使用了数字字面量而不是字符串字面量。一旦创建了非BigInt数字字面量,您就已经失去了精度。请参见https://v8.dev/features/bigint#api。 - Mathias Bynens

5
您可以使用名为 BigInteger.js 的 JavaScript 库来实现此目的。它是一个用于 JavaScript 的任意长度整数库,允许对大小不受限制的整数进行算术运算,而不受内存和时间限制的影响。您可以从此链接下载此库,例如:var largeNumber = bigInt("75643564363473453456342378564387956906736546456235345"); 您可以在此处找到该库的文档:https://www.npmjs.com/package/big-integer

1
你可以使用 mathjs
var reqId = "78099864177253771992779766288266836166272662";
var myBigNumber = math.bignumber(reqId);
var res = math.add(myBigNumber, 1);
console.log(myBigNumber.toString());
// 7.8099864177253771992779766288266836166272662e+43
console.log(res.toString());
// 7.8099864177253771992779766288266836166272663e+43

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接