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,9007199254740992y9007199254740993. - 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.