49 votes

Transfert JSON de bigint : 12000000000002539 est converti en 12000000000002540 ?

Je transfère des données brutes comme [{id: 12000000000002539, Name: "Some Name"}] et j'obtiens l'objet [{id: 12000000000002540, Name: "Some Name"}] après l'analyse, pour l'instant la conversion côté serveur de l'identifiant en chaîne semble fonctionner. Mais existe-t-il un meilleur moyen de transférer correctement les données bigint ?

94voto

La valeur est en fait no dépassant la valeur numérique maximale en JavaScript (qui est "seulement" de 1,7 308 ou plus).

Cependant, la valeur es dépassant la plage de "précision intégrale". Ce n'est pas que le mauvais nombre est envoyé : c'est plutôt que le littéral 12000000000002539 ne peut être représentée que de manière aussi précise que 12000000000002540, et il y avait donc jamais la valeur numérique correcte en JavaScript. (Le gamme d'intégrales est d'environ +/- 2 53 .)

Il s'agit d'un phénomène intéressant d'utilisation une double précision relative (binary64 en langage IEEE-754) pour stocker toutes les valeurs numériques, y compris les entiers :

12000000000002539 === 12000000000002540 // true

Le nombre maximal de chiffres décimaux significatifs pouvant être stockés avec précision sous forme de valeur numérique est de 15 (15,95, en réalité). Dans l'exemple ci-dessus, il y a 17 chiffres significatifs, ce qui signifie que certains des chiffres de l'équation sont des chiffres significatifs. l'information la moins importante est silencieusement perdue. . Dans ce cas, comme l'analyseur/moteur JavaScript lit la valeur littérale.

La seule manière sûre de traiter des nombres entiers de cette ampleur en JavaScript est d'utiliser une chaîne littérale ou de la décomposer d'une autre manière (par exemple, un type numérique personnalisé ou un "bibliothèque bigint" ). Cependant, Je recommande d'utiliser simplement une chaîne car il est lisible par l'homme, relativement compact (seulement deux caractères supplémentaires en JSON) et ne nécessite pas de sérialisation particulière. Comme la valeur n'est qu'un "id" dans ce cas, j'espère qu'il n'est pas nécessaire d'effectuer des calculs sur cette valeur :)

Bon codage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X