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 ?
Réponse
Trop de publicités?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.