首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过JSON发送64位值的公认方式是什么?

通过JSON发送64位值的公认方式是什么?
EN

Stack Overflow用户
提问于 2008-10-16 19:13:17
回答 6查看 29.5K关注 0票数 36

我的一些数据是64位整数。我想把这些发送给一个在页面上运行的JavaScript程序。

但是,据我所知,大多数JavaScript实现中的整数都是32位有符号数量。

我的两个选择似乎是:

  1. 将值作为字符串发送
  2. 将值作为64位浮点数发送

选项(1)并不完美,但选项(2)似乎远没有那么完美(数据丢失)。

你是如何处理这种情况的?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-16 19:20:30

这似乎不是JSON的问题,而是Javascript本身的问题。你打算用这些数字做什么?如果它只是一个神奇的令牌,您需要稍后将其传递回网站,那么一定要使用包含该值的字符串。如果您实际上必须对值进行算术运算,则可以编写自己的64位算术Javascript例程。

在Javascript (以及JSON)中表示值的一种方法是将数字拆分为两个32位的值,例如。

代码语言:javascript
复制
  [ 12345678, 12345678 ]

要将一个64位值拆分为两个32位值,请执行以下操作:

代码语言:javascript
复制
  output_values[0] = (input_value >> 32) & 0xffffffff;
  output_values[1] = input_value & 0xffffffff;

然后将两个32位值重新组合为64位值:

代码语言:javascript
复制
  input_value = ((int64_t) output_values[0]) << 32) | output_values[1];
票数 26
EN

Stack Overflow用户

发布于 2016-01-25 17:43:58

事实上,JavaScript/ECMAScript级别的精度限制为53位整数(它们存储在“双精度”8字节内存缓冲区的尾数中)。因此,将大数字作为JSON传输并不会像JavaScript客户端预期的那样进行反序列化,这会将它们截断为53位分辨率。

代码语言:javascript
复制
> parseInt("10765432100123456789")
10765432100123458000

请参见Number.MAX_SAFE_INTEGER constantNumber.isSafeInteger()函数:

MAX_SAFE_INTEGER常量的值为9007199254740991。这个数字背后的原因是,JavaScript使用IEEE754中指定的双精度浮点格式的数字,并且只能安全地表示-(2^53 - 1)2^53 - 1之间的数字。

本文中的安全是指准确表示整数并正确比较它们的能力。例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2将计算为true,这在数学上是不正确的。有关详细信息,请参阅Number.isSafeInteger()

由于JavaScript中浮点数的分辨率,使用您建议的“64位浮点数”将受到完全相同的限制。

我想最好的选择是像文本一样传递这样的值。它仍然是完全可读的JSON内容,并且很容易在JavaScript级别进行操作。

“纯字符串”表示就是OData specifies, for its Edm.Int64 or Edm.Decimal types

在本例中,Twitter API所做的是在JSON中添加一个特定的".._str":字段,如下所示:

代码语言:javascript
复制
{
   "id": 10765432100123456789,           // for JSON compliant clients
   "id_str": "10765432100123456789",     // for JavaScript
    ...
}

我非常喜欢这个选项,因为它仍然与支持int64的客户端兼容。在实践中,如果在HTTP级别压缩/压缩JSON中的重复内容,则不会造成太大伤害。

作为字符串传输后,您可以使用诸如strint – a JavaScript library for string-encoded integers之类的库来处理这些值。

更新:较新版本的JavaScript引擎包括一个BigInt对象类,它能够处理超过53位的数据。事实上,它可以用于任意大的整数,因此非常适合64位整数值。但是当序列化为JSON时,BigInt的值是will be serialized as a JSON string -很奇怪,但是出于兼容性的目的,我猜。

票数 22
EN

Stack Overflow用户

发布于 2009-05-13 16:08:16

Javascript的Number类型(64位IEEE754)只有大约53位的精度。

但是,如果您不需要做任何加法或乘法,那么您可以将64位的值保留为4个字符的字符串,因为JavaScript使用UTF-16。

例如,1可以编码为“\u0000\u0001”。这样做的好处是,值比较(==,>,<)可以在字符串上按预期工作。写比特操作似乎也很简单:

代码语言:javascript
复制
function and64(a,b) {
    var r = "";
    for (var i = 0; i < 4; i++)
        r += String.fromCharCode(a.charCodeAt(i) & b.charCodeAt(i));
    return r;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/209869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档