1

当我使用 Javascript 时:

h3Int = parseInt("8B2A100D1D98FFF",16) //626740323050688500
h3Int.toString(16).toUpperCase() // 8B2A100D1D99000

所以似乎在两个方向上都没有让我得到相同的结果

任何想法?

4

2 回答 2

1

这与H3无关。

JavaScript 常用的数字类型是 IEEE-754 双精度浮点数。Adouble存在于内存中的 64 位空间中,并将其分为一个符号位、11 个指数位和 52 个有效位的分数;另一个有效位隐含可用。结果如果你去控制台,你可以看到:

> 2**53
9007199254740992
> 2**53 - 1
9007199254740991
> 2**53 + 1
9007199254740992

此时数字之间的差距已经扩大到最小大小为2的地步;将该数字加 1 向下舍入。这最终就是为什么你的底部 11 位左右被四舍五入破坏了。

我们所说的语言中正在添加一个更新的BigInt结构,但目前在 Edge、Safari 或 Internet Explorer 等旧浏览器中不存在 - 但如果您使用的是 Node.js 左右,您也许可以使用它可靠。JSON.parse即使它存在,它也没有支持。但除此之外,它完全符合您的要求;在支持控制台中:

> x = 0x8B2A100D1D98FFFn
626740323050688511n
> x === BigInt('0x' + '8B2A100D1D98FFF')
true
> x.toString(16)
'8b2a100d1d98fff'

否则,有像json-bigint这样的库(假设您需要从 JSON 解析这些,JSON.parse无法工作,因为它将所有数字解析为内置number类型),它使用一个调用库bignumber.js来使用 JS 对象来表示更大使用较小数字的数字。

于 2019-09-05T17:52:19.807 回答
1

您可以在h3-js此处查看用于执行此转换的函数:https ://github.com/uber/h3-js/blob/9a20295a2377f415ecc3ef6ad50410f948bfbeb2/lib/h3core.js#L84

正如@cr-drost 正确解释的那样,我们不能在 JS 中直接使用 64 位 int,所以我们将其分为高 32 位和低 32 位。这些可以可靠地与 32 位十六进制字符串相互转换。

于 2019-09-06T22:39:11.130 回答