2013-07-08 31 views
7

Tôi đang trả lại danh sách các tweet được phê duyệt từ máy chủ web ở định dạng JSON. Khi tôi đi đến URL: http://localhost:8000/showtweets/?after_id=354210796420608003 trong trình duyệt của tôi tôi nhận được JSON sau:Javascript không phân tích cú pháp số lớn trong JSON chính xác

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

nào có id là: 354210796420608004.

Khi tôi thực hiện cuộc gọi GET từ Javascript, số lượng thay đổi:

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

Mã này cảnh báo: 354210796420608000, #RaspberryPi ist auf dem Weg :-)

354210796420608004 = 354210796420608000

Rất lẻ.

+3

JS "số nguyên" tối đa là 2^53 = 9007199254740992. Hàng của bạn lớn hơn rất nhiều. xem ở đây http://stackoverflow.com/questions/4557509/javascript-summing-large-integers – Bakudan

Trả lời

11

Không, không quá kỳ quặc. JS đại diện cho tất cả các số là gấp đôi, và với số nguyên ngày càng tăng bạn mất độ chính xác tại một số điểm. Xem What is JavaScript's highest integer value that a Number can go to without losing precision? để biết chi tiết.

Để giải quyết vấn đề, chỉ cần tạo một chuỗi id - bạn vẫn chưa thực hiện các phép tính với chuỗi đó. Mặc dù vậy, bạn sẽ phải thực hiện điều đó trong JSON gốc, nếu không thì mất chính xác xảy ra tại JSON.parse rồi.

+0

Ngoài ra còn có thư viện [bignum] (https://github.com/jtobey/javascript-bignum) cho javascript trong trường hợp ID không cần phải làm việc với số học. – Mike

+0

Tôi đảm bảo rằng id đã được chuyển đổi thành chuỗi trước khi được truyền lại từ máy chủ. Điều này giải quyết vấn đề. Cảm ơn. – tompreston

Các vấn đề liên quan