2010-02-27 8 views
6

tôi đã phải đối mặt với một vấn đề tiếp theo:jQuery và dài int id

Trong cơ sở dữ liệu của chúng tôi, chúng tôi có các đối tượng với id, như 4040956363970588323. Tôi đang viết một số client-wizard trên jQuery để tương tác với các đối tượng như vậy. Khách hàng nhận dữ liệu cơ sở về các đối tượng trough một Ajax yêu cầu, như:

$.ajax({ 
     url: "/api/pages/", 
     type: "get", 
     dataType: "json", 
     data: {"id": site_id}, 
     success: function(data){ 
      if (data.success){ 
       for (var pidx in data.pages){ 
        console.log(data.pages[pidx].id); 
        var li = $('<li class="ui-widget-content"></li>'); 
        var idf = $('<input type="hidden" id="pid" value="{0}"/>'.format(data.pages[pidx].id)) 
        var urlf = $('<input type="hidden" id="purl" value="{0}"/>'.format(data.pages[pidx].url)) 
        li.text(data.pages[pidx].title); 
        li.append(idf); 
        li.append(urlf); 
        $("#selectable_pages_assign").append(li); 
       } 
       pages_was = $("#selectable_pages_assign>li"); 
      } 
      else 
       updateTips(data.message); 
     }, 
     error: function(){ 
      updateTips("Internal erro!"); 
     } 
}) 

Vì vậy, như bạn thấy tôi gửi dữ liệu như JSON đối tượng (một chút mã server):

return HttpResponse(dumps({ 
         "success": True, 
         "pages": [{"id": page.id, "title": page.title, "url": page.image} for page in Page.objects.filter(site = site)] 
      })) 

Theo Firebug, máy chủ gửi id phải trong dữ liệu, nhưng console.log(..) thay vì id chính xác (4040956363970588323), kết quả đầu ra id 4040956363970588000.

Tại sao điều này lại xảy ra?

Nếu không có id đúng, bất kỳ cơ hội, mà thuật sĩ của tôi sẽ làm việc một cách chính xác :)

+0

FWIW, thông báo lỗi của bạn cho biết 'updateTips (" Internal erro! ");' (Typo on the word "error"). Đó là loại thú vị: P –

Trả lời

9

tôi đoán là một cái gì đó đang xảy ra sai trong việc chuyển đổi sang JSON. Khi bạn viết giá trị, có thể bạn sẽ cần phải đặt dấu ngoặc kép xung quanh nó, để đảm bảo nó được coi là một chuỗi.

+1

+1 để đảm bảo gửi nó dưới dạng chuỗi – tvanfosson

+0

phiếu bầu khác để đặt giá trị id thành chuỗi – Pointy

+0

Và bạn làm như thế nào? Tôi lấy một giá trị từ dữ liệu HTML5 và cố xử lý nó như một chuỗi nhưng nó vẫn được làm tròn không chính xác: ''' + $ (this) .data ('id') + '''. Có cách nào tốt hơn để làm điều này? – andrewtweber

3

Điều đó giống như một số loại vấn đề tràn với tôi.

Theo this discussion đây trên SO, JavaScript chỉ có thể xử lý INTs kích thước 2^64, có nghĩa là max INT được ở đâu đó xung quanh

184467440737100000 

mà là nhiều ít hơn

4040956363970588323 

EDIT : Xin lỗi, số nguyên chính xác lớn nhất là 2^53, nhưng trường hợp là như nhau.

+0

Cảm ơn bạn đã trả lời, thông tin rất hữu ích –

+1

Số JavaScript là các giá trị dấu phẩy động kép chính xác IEEE 754, với tiêu chuẩn duy nhất là tiêu chuẩn ECMAScript dựa trên JavaScript chỉ cung cấp một giá trị 'NaN' duy nhất thay vì có lẽ nhiều hơn. Do đó, bạn mất chính xác số nguyên khi bạn vượt quá độ chính xác của biểu diễn, chính xác giữ nguyên tất cả các số nguyên có độ lớn nhỏ hơn 2 ** 53 và chỉ giữ lại một số số nguyên bên ngoài phạm vi đó (số nguyên có biểu diễn nhị phân đẹp, ít hoặc nhiều) khi cường độ tăng lên cho đến khi tràn hoàn toàn xảy ra với các giá trị vô cùng). –