2010-02-27 17 views
6

que he enfrentado con un problema siguiente:jQuery y largas identificadores de int

En nuestra base de datos que tienen objetos con los identificadores, como 4040956363970588323. estoy escribiendo algún cliente-asistente en jQuery para interactuar con dichos objetos. El cliente recibe los datos de base sobre objetos Trough un Ajax solicitud, como:

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

Así que, como ves que enviar los datos al igual que JSON objeto (un poco de código de servidor):

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

Según Firebug, el servidor envía identificadores correctos en los datos, pero console.log(..) en lugar de la identificación correcta (4040956363970588323), salidas id 4040956363970588000.

¿Por qué sucede esto?

sin ID correctas, ninguna posibilidad, de que mi asistente le funciona correctamente :)

+0

FWIW, su mensaje de error dice 'updateTips (" ¡Error interno! ");' (Error en la palabra "error"). Lo cual es algo divertido: P –

Respuesta

9

Mi conjetura es que algo va mal en la conversión a JSON. Cuando escriba el valor, probablemente deba poner comillas alrededor para asegurarse de que se trate como una cadena.

+1

+1 para asegurarse de enviarlo como una cadena – tvanfosson

+0

otro voto para hacer que el valor de identificación sea una cadena – Pointy

+0

¿Y cómo lo haces? Estoy tomando un valor de datos HTML5 e intento tratarlo como una cadena, pero aún se redondea incorrectamente: ''' + $ (this) .data ('id') + '''. ¿Hay una mejor manera de hacer esto? – andrewtweber

3

Eso me parece un problema de desbordamiento.

Según this discussion aquí en SO, JavaScript sólo puede manejar intercepciones de tamaño 2^64, lo que significa el máximo INT está en algún lugar alrededor

184467440737100000 

que es mucho menor que

4040956363970588323 

EDITAR : Lo sentimos, el entero exacto más grande es 2^53, pero el caso es el mismo.

+0

gracias por su respuesta, información muy útil –

+1

Los números de JavaScript son valores de coma flotante de precisión doble IEEE 754, con la única calificación de que el estándar ECMAScript en el que se basa JavaScript proporciona solo un valor 'NaN' en lugar de tal vez más. Por lo tanto, pierde precisión entera cuando excede la precisión de la representación, que preserva exactamente todos los enteros con una magnitud menor que 2 ** 53, y solo conserva algunos enteros fuera de ese rango (unos con bonitas representaciones binarias, más o menos, adelgazamiento) a medida que la magnitud aumenta hasta que se produce el desbordamiento completo de los valores de infinito). –

Cuestiones relacionadas