9

我正在以 JSON 格式从网络服务器传回已批准的推文列表。当我转到 URL:http://localhost:8000/showtweets/?after_id=354210796420608003在我的浏览器中,我得到以下 JSON:

   [{
    "date": "2013-07-08T12:10:09",
    "text": "#RaspberryPi ist auf dem Weg :-)",
    "author_pic_url": "http://a0.twimg.com/profile_images/1315863231/twitter_normal.jpg",
    "id": 354210796420608004,
    "author": "switol"
}]

其 id 为:354210796420608004

当我从 Javascript 进行 GET 调用时,数字会发生变化:

function TweetUpdater() {
}

TweetUpdater.latest_id = 0;
TweetUpdater.undisplayed_tweets = new Array();

TweetUpdater.prototype.get_more_tweets = function () {
    // var since_id = parseFloat(TweetUpdater.get_latestlatest_id;
    // alert(since_id);
    var get_tweets_url = "/showtweets/?after_id="+TweetUpdater.latest_id;
    $.get(get_tweets_url, function (tweets) {
        if (tweets.length > 0) {

            /////////////////////////////////////////////////////////
            alert(tweets[0].id+", "+ tweets[0].text); <<<<< THIS LINE
            /////////////////////////////////////////////////////////

            TweetUpdater.latest_id = tweets[0].id;
            for (var i = 0; i < tweets.length; i++) {
                TweetUpdater.undisplayed_tweets.push(tweets[i]);
            }
        }
    }, "json");
};

此代码警告:354210796420608000, #RaspberryPi ist auf dem Weg :-)

354210796420608004 != 354210796420608000

很奇怪。

4

2 回答 2

13

不,不是很奇怪。JS 将所​​有数字表示为双精度数,并且随着整数的增长,您在某些时候会失去精度。请参阅JavaScript 在不丢失精度的情况下 Number 可以达到的最高整数值是多少?详情。

要解决这个问题,只需制作id一个字符串 - 无论如何你都不会用它进行计算。不过,您必须在原始 JSON 中执行此操作,否则精度损失JSON.parse已经发生。

于 2013-07-08T16:07:43.243 回答
2

在使用 twitter API 时尝试使用 id_str 而不是 id,它应该可以工作。看到这个https://dev.twitter.com/discussions/11284

于 2013-07-08T16:15:23.277 回答