假设我想将一个36进制编码的字符串转换为一个BigInt
,我可以这样做:
BigInt(parseInt(x,36))
但是如果我的字符串超出了一个安全的 JavaScript Number 的范围怎么办?例如:
parseInt('zzzzzzzzzzzzz',36)
然后我开始失去精度。
是否有将解析方法直接转换为 BigInt
的方法?
假设我想将一个36进制编码的字符串转换为一个BigInt
,我可以这样做:
BigInt(parseInt(x,36))
但是如果我的字符串超出了一个安全的 JavaScript Number 的范围怎么办?例如:
parseInt('zzzzzzzzzzzzz',36)
然后我开始失去精度。
是否有将解析方法直接转换为 BigInt
的方法?
您可以将数字转换为 bigint
类型。
function convert(value, radix) {
return [...value.toString()]
.reduce((r, v) => r * BigInt(radix) + BigInt(parseInt(v, radix)), 0n);
}
console.log(convert('zzzzzzzzzzzzz', 36).toString());
使用更大的块,例如用十个(十一个会返回错误结果)。
function convert(value, radix) { // value: string
var size = 10,
factor = BigInt(radix ** size),
i = value.length % size || size,
parts = [value.slice(0, i)];
while (i < value.length) parts.push(value.slice(i, i += size));
return parts.reduce((r, v) => r * factor + BigInt(parseInt(v, radix)), 0n);
}
console.log(convert('zzzzzzzzzzzzz', 36).toString());
Number.MAX_SAFE_INTEGER.toString(36).length
).. 嗯,我猜是10吧。 - mpenfunction parseBigInt(
numberString,
keyspace = "0123456789abcdefghijklmnopqrstuvwxyz",
) {
let result = 0n;
const keyspaceLength = BigInt(keyspace.length);
for (let i = 0; i < numberString.length; i++) {
const value = keyspace.indexOf(numberString[i]);
if (value === -1) throw new Error("invalid string");
result = result * keyspaceLength + BigInt(value);
}
return result;
}
console.log(parseInt("zzzzzzz", 36));
console.log(parseBigInt("zzzzzzz"));
console.log(parseBigInt("zzzzzzzzzzzzzzzzzzzzzzzzzz"));
输出
78364164095
78364164095n
29098125988731506183153025616435306561535n
0
结尾的字符串都不能产生正确的结果? - Zak HenryparseBigInt('xyz').toString(36)
返回的结果是 zyx
。问题在于它以相反的顺序迭代字符串,从而以相反的顺序解析数字。 - luscresult = result * number-of-digits + current-digit
的操作... - AKXparseBigInt('xyz').toString(36)
吗?除非我漏掉了什么,它不应该返回zyx
。 - lusc
parseInt
的等效物。该提案中唯一提到的字符串转换是BigInt()
函数本身,但它仅包括2、8、10和16进制。 - Thomas