Guía

Números grandes en JSON y pérdida de precisión

Evita que identificadores y enteros de más de 53 bits cambien al analizar, formatear o convertir JSON en JavaScript.

por Tools in a Tab · Publicado el · Revisado el

Respuesta breve

La gramática JSON permite escribir enteros con muchas cifras, pero el programa que los lee puede no representarlos exactamente. En JavaScript, Number usa coma flotante binaria y solo conserva todos los enteros hasta 9007199254740991 (2^53 - 1).

Ejemplo de pérdida

{
  "id": 9007199254740993
}

Un análisis que convierta inmediatamente ese token a Number puede redondearlo a 9007199254740992. El JSON era sintácticamente válido; la pérdida ocurre en la representación del consumidor.

La RFC 8259 señala que los enteros dentro de [-(2^53)+1, (2^53)-1] son el rango donde implementaciones comunes pueden acordar exactamente el valor.

Cuándo usar una cadena

Si el número es un identificador, teléfono, código, cuenta o valor sobre el que no harás aritmética, una cadena evita el redondeo y conserva ceros iniciales:

{
  "id": "9007199254740993"
}

Para cantidades que sí requieren cálculo exacto, acuerda un tipo decimal o de entero grande en ambos extremos y una estrategia de serialización. BigInt de JavaScript no se serializa automáticamente como un número JSON mediante JSON.stringify.

Herramientas que conservan el token

El formateador JSON de Tools in a Tab conserva los lexemas numéricos al formatear o minificar, en vez de redondearlos mediante un parseo ordinario. El conversor JSON a YAML también conserva las cifras, pero el consumidor final todavía debe admitirlas.

Checklist

  • Define si el campo es cantidad o identificador.
  • Prueba los límites 9007199254740991, 9007199254740992 y 9007199254740993.
  • Comprueba análisis, transformación, base de datos y reserialización.
  • No uses notación exponencial si el consumidor exige dígitos exactos.
  • Documenta el rango aceptado en el contrato de la API.