【问题标题】:JSON response get modified by the browserJSON响应被浏览器修改
【发布时间】:2013-04-12 13:25:50
【问题描述】:

我正在调用返回 JSON 数据的 RESTFUL Web 服务。响应包含一个数值(不带引号)10000000000223169,但在针对此响应获取 JavaScript 对象后,我得到 10000000000223168。

直接在浏览器中显示的 JSON 响应也显示 10000000000223168,但内容选项卡中的 FireBug HTTP 响应显示正确的值,即 10000000000223169

【问题讨论】:

  • 您的服务是否返回序列号?如果是这样,您的代码可能会调用 RESTFUL 服务两次(显示第一次)。奇怪的是,您得到的结果正好少了 1 个数字!
  • @Zachary 不,这与此无关。这是因为 JS 中没有这样的(合法的)整数。

标签: javascript json http httpresponse


【解决方案1】:

这是因为 JavaScript 中的数字是 IEEE754 double precision floats

整数最多只能表示为 2^53。

您的号码太大,无法作为数字发送,您应该将其作为字符串发送。

如果您需要在浏览器中使用此数字进行计算,最简单的解决方案是使用大数字专用库(请参阅this related question)。

【讨论】:

  • 很多大数都可以精确表示,要运气好。当然,数字越大,准确表示的可能性就越小。
【解决方案2】:

10000000000223169 超出了在 JavaScript(以及 JSON)中可以表示为精确整数的范围。它大约是 2 ^ 53.151,而 IEEE 754 仅允许双精度浮点数尾数中的 53 位分辨率。

要在不修改的情况下传输它,需要将其作为字符串发送。

在使用此代码的客户端中,还需要将其存储为字符串或 64 位整数(假设您使用的是具有此类数据类型的语言)。

如果您尝试将其存储在 IEEE 754 浮点数中(这是 JS 中的默认数字类型,只要您尝试对其执行任何数学运算,它仍会四舍五入为 53 位精度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多