2^53 + 1
- Entrada
- {"id": 9007199254740993}
- Saída esperada
- aviso na coluna 8: o JavaScript lê 9007199254740992
O texto de saída mantém 9007199254740993.
json número grande perde precisão
Cole o JSON com o id ou o decimal suspeito: cada número que o JavaScript não consegue guardar com exatidão recebe um aviso com o valor que ele leria, e o texto de saída mantém os dígitos originais. Na árvore, o número ganha uma marca de precisão.
O texto de saída mantém 9007199254740993.
Os últimos dígitos são perdidos na leitura.
Number.MAX_SAFE_INTEGER é exato.
Perda de precisão em decimal.
Estouro do maior double.
Potências de 2 cabem no double.
As causas mais comuns são vírgula depois do último item, aspas simples, chave sem aspas, comentário e vírgula faltando entre dois valores. O JSON.parse informa só o primeiro problema e, em alguns navegadores, apenas a posição em caracteres. Este formatador lista todos os erros do texto, cada um com linha e coluna, mostra o trecho com uma seta sob o ponto exato, marca a linha na margem do editor e tem o botão Ir para o erro, que seleciona o trecho.
É 9007199254740991, ou 2^53 - 1, exposto como Number.MAX_SAFE_INTEGER. Até esse valor todo inteiro tem uma representação única; acima dele, números diferentes podem ser lidos como o mesmo.
Não. A gramática aceita qualquer quantidade de dígitos. O limite vem das implementações, e a RFC 8259 recomenda não esperar mais precisão do que um double IEEE 754 oferece quando a interoperabilidade importa.
Envie como string: "id": "1234567890123456789". O receptor em JavaScript guarda o texto, e quem precisa de aritmética converte para BigInt. É por isso que várias APIs oferecem o campo id_str ao lado do numérico.
Não. O formatador guarda o texto original de cada número e escreve os mesmos dígitos, inclusive os zeros finais, como em 1.50. O aviso existe para você saber que o próximo programa em JavaScript vai arredondar.