Nodejs 中 64 位整数表示

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs 中 64 位整数表示
需要从 Buffer 里读出来一个 64 位的整数,发现 JS 最大精确的整数< 64 位,所以不提供 readUint64BE 的方法。如果用 bignum 处理就太麻烦,所有相关的四则运算都得改写成函数调用。

幸好 Buffer 里的数字也没有超过 JS 最大的整数值,所以就用 JS 的整数简单代替了一下,一旦发现 Buffer 这个值的高位超过了最大整数的高位就直接报错了事。

大家都是怎么处理这种问题的

10 回复

js 里面是 float64,可以精确涵盖 int53 范围的整数,如果够用就用 js 内置的浮点数就行了


有个 long.js
可以把 buffer 转成 long 对象,分 high、low,还可以.toString

是 64 位的偏移量,指向文件内的一个位置,浮点肯定不行。

这个跟 bignum 的问题一样,要用它的方法代替运算符,不过这可能是 js 上的唯一方式。
不知道 typescript 有没有 64 位的强类型,或者要考虑 webassembly 了。

30bit 是 1GB, 40bit 是 1TB, 50bit 是 1PB, 指向文件内的一个位置很小的,
int53 足够表示, 这是 double 型能精确表示的整数区域.

现在就得改成函数调用;将来的话,有个 stage-3 的提案 https://github.com/tc39/proposal-bigint

确实,忘记算一下了,暂时用 js 的整数不会出问题。

这个不知道啥时候能成正式的标准,而且说混合普通数值运算会丢精度,这就有点坑了。
53 位的整数看上去还不错,一般见不到那么大的文件。

#8 仔细看,他说的是因为混合运算会丢精度,所以不允许混合运算,要你手动调用 Number()或 BigInt()来转换类型再运算

在 Node.js 中,JavaScript 原生并不直接支持 64 位整数,因为 JavaScript 的 Number 类型遵循双精度 64 位浮点数格式(IEEE 754),这导致它只能精确表示到 53 位二进制数(约 15-17 位十进制数)。对于需要精确表示更大范围的整数,特别是 64 位整数,你可以使用 BigInt 类型或者第三方库。

使用 BigInt

BigInt 是一种内置对象,提供了一种方法来表示大于 2^53 - 1 或小于 -(2^53 - 1) 的整数。BigInt 通过在整数后面添加 n 来表示。

示例代码:

const bigInt64 = 9007199254740991n; // 2^53 - 1
const anotherBigInt = 123456789012345678901234567890n;

console.log(bigInt64); // 输出: 9007199254740991n
console.log(anotherBigInt); // 输出: 123456789012345678901234567890n

使用第三方库(如 node-int64

如果你需要更多关于 64 位整数的操作(如位运算),可以使用第三方库,如 node-int64

安装:

npm install node-int64

使用示例:

const Int64 = require('node-int64');

const int64Value = new Int64(1234567890123456789);

console.log(int64Value.toString()); // 输出: 1234567890123456789
console.log(int64Value.toBuffer().toString('hex')); // 转换为十六进制表示

这两种方法都能帮助你在 Node.js 中表示和处理 64 位整数。

回到顶部