Tenho duas mentalidades conflitantes:
Mentalidade 1:
Números JSON são sempre números de ponto flutuante de precisão dupla. Portanto:
- Não há diferença semântica entre
1
e1.0
- ambos representam exatamente o mesmo número; 12345678901234567890
na verdade é12345678901234567000
porque12345678901234567890
não pode ser representado com precisão como um número de ponto flutuante de precisão dupla.
Mentalidade 2:
Números JSON nem sempre podem ser interpretados como números de ponto flutuante de precisão dupla. JSON é um protocolo de comunicação distinto do JavaScript. A crença de que números JSON são sempre números de ponto flutuante de precisão dupla decorre da confusão entre JavaScript e JSON e das idiossincrasias do analisador e serializador JSON padrão em JavaScript, que os interpreta dessa maneira. Portanto:
1
e1.0
não precisam ser os mesmos. Em particular, a presença ou ausência do final.0
pode ser usada para codificar informações de tipo. Muitas linguagens de programação, como Java ou C#, distinguem entre inteiros e números de ponto flutuante. É razoável exigir que inteiros em tais linguagens sejam sempre serializados sem o final.0
, enquanto números de ponto flutuante devem sempre ser serializados com o final.0
.12345678901234567890
e12345678901234567000
não são os mesmos números. Certos analisadores amplamente usados os interpretam, por padrão, como o mesmo número porque eles forçam um número JSON em um número de ponto flutuante de precisão dupla - mas isso é nesses analisadores, e não no JSON em si.
Qual dessas duas mentalidades - se houver alguma - está correta?
Pesquisar no Google parece produzir resultados conflitantes.
- https://json-schema.org/understanding-json-schema/reference/numeric diz isto: " JSON não tem tipos distintos para inteiros e valores de ponto flutuante. Portanto, a presença ou ausência de um ponto decimal não é suficiente para distinguir entre inteiros e não inteiros. Por exemplo, 1 e 1.0 são duas maneiras de representar o mesmo valor em JSON. " - então parece que isso é consistente com a Mentalidade 1;
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON fala sobre o uso de JSON para serializar e desserializar números grandes que não podem ser armazenados como números de ponto flutuante de precisão dupla - então parece ser consistente com a mentalidade 2.