2013-07-08 6 views
7

Ich gebe eine Liste genehmigter Tweets von einem Webserver im JSON-Format zurück. Als ich in die URL: http://localhost:8000/showtweets/?after_id=354210796420608003 in meinem Browser erhalte ich die folgende JSON:Javascript analysiert keine große Zahl in JSON korrekt

[{ 
    "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" 
}] 

, die eine ID von hat: 354210796420608004.

Wenn ich einen Anruf von GET Javascript machen, die Zahl ändert sich:

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"); 
}; 

Dieser Code-Benachrichtigungen: 354210796420608000, #RaspberryPi ist auf dem Weg :-)

354210796420608004 = 354210796420608000

Sehr seltsam.

+3

JS "Ganzzahlen" sind höchstens 2^53 = 9007199254740992. Ihre ist viel größer. schaue hier http://StackOverflow.com/Questions/4557509/Javascript-Summing-Large-Integers – Bakudan

Antwort

11

Nein, nicht sehr merkwürdig. JS stellt alle Zahlen als doppelt dar, und mit wachsenden Ganzzahlen verliert man irgendwann die Genauigkeit. Einzelheiten finden Sie unter What is JavaScript's highest integer value that a Number can go to without losing precision?.

Um das Problem zu lösen, machen Sie einfach die id eine Zeichenfolge - Sie tun sowieso nichts mit Berechnungen. Sie müssen dies jedoch im ursprünglichen JSON tun, andernfalls tritt der Präzisionsverlust bereits bei JSON.parse auf.

+0

Es gibt auch [bignum] (https://github.com/jtobey/javascript-bignum) Bibliotheken für Javascript im Falle der ID muss mit arithmetisch gearbeitet werden. – Mike

+0

Ich stellte sicher, dass die ID in eine Zeichenfolge konvertiert wurde, bevor sie vom Server zurückgegeben wurde. Dies löst das Problem. Vielen Dank. – tompreston

Verwandte Themen