2012-05-17 18 views
7

Mi problema es realmente simple, pero no estoy seguro de si hay una solución "nativa" usando JSON.parse.JSON.parse analiza/convierte números grandes incorrectamente

recibo este cadena de una API:

{ "key" : -922271061845347495 } 

Cuando estoy usando JSON.parse en esta cadena, se convierte en el objeto :

{ "key" : -922271061845347500 } 

Como puede ver, el análisis se detiene cuando el número es demasiado largo (puede verificar este comportamiento here). Tiene solo 15 dígitos exactos, el último se redondea y los posteriores se establecen en 0. ¿Hay alguna solución "nativa" para mantener el valor exacto? (es una identificación así que no puedo redondearlo)

Sé que puedo usar la expresión regular para resolver este problema, pero preferiría usar un método "nativo" si existe.

+1

¿Se puede hacer una cadena? Pruebe con –

+0

, '{ "clave": "-922271061845347495"}' – Jashwant

+1

Esto ofrece varias respuestas: [pila de subprocesos desbordamiento] [1] [1]: http://stackoverflow.com/ questions/209869/what-is-the-accepted-way-to-send-64-bit-values-over-json –

Respuesta

15

Su suposición de que el análisis se detiene después de ciertos dígitos es incorrecto.

Dice here:

números de punto flotante

En JavaScript todos los números están. JavaScript utiliza la 8 bytes IEEE formato numérico estándar de punto flotante, lo que significa el rango es de:

± 1.7976931348623157 x 10 - muy grande, y ± 5 x 10 -324 - muy pequeño.

Como JavaScript utiliza números de punto flotante la exactitud sólo quedará garantizado para los enteros entre: -9007199254740992 (-2) y 9007199254740992 (2)

número Usted se encuentra fuera del rango "preciso" por lo tanto, se convierte a la representación más cercana del número de JavaScript. Cualquier intento de evaluar este número (usando JSON.parse, eval, parseInt) causará la pérdida de datos. Por lo tanto, recomiendo que pase la llave como una cadena. Si no controla la API, presente una solicitud de función.

+0

Esto en realidad no responde la pregunta, sin embargo. "¿Hay una solución nativa para mantener el valor exacto?" –

+0

La solución nativa sería escribir su propio analizador JSON que analiza los números como cadenas. –

+0

@Salman A: Gracias por sus explicaciones y consejos.Probablemente esperaré un poco antes de hacer mi propio analizador y enviar las claves como cadenas y luego analizarlas en un número en el lado de la API. – Simon