Przenoszę dane surowe, takie jak [{id: 12000000000002539, Name: "Some Name"}]
i otrzymuję obiekt [{id: 12000000000002540, Name: "Some Name"}]
po przeanalizowaniu, ponieważ teraz id konwersji po stronie serwera na ciąg wydaje się pomagać. Ale czy istnieje lepszy sposób na poprawne przeniesienie danych bigint?Transfer JSON z bigint: 12000000000002539 jest konwertowany na 12000000000002540?
Odpowiedz
Wartością jest rzeczywiście nie przekroczenia maksymalnej wartości numerycznych w JavaScript (który jest „tylko” 1,7 lub tak).
Jednak wartość przekracza zakres "całkowitej dokładności". Nie jest tak, że wysyłany jest niewłaściwy numer: raczej, że literalny może być reprezentowany tylko tak dokładnie, jak 12000000000002540, a zatem nie było nigdy poprawnej wartości liczbowej w kodzie JavaScript. (The range of integrals wynosi około +/- 2 .)
Jest to ciekawe zjawisko korzystania a double relative-precision (binary64 w IEEE-754 powiem) wpisać do przechowywania wszystkich wartości numerycznych, w tym całkowite:
12000000000002539 === 12000000000002540 // true
Maksymalna znacząca liczba cyfr dziesiętnych, które są precyzyjnie zapisywane jako wartość liczbowa, to 15 (15,95, naprawdę). W powyższym przykładzie jest 17 cyfr znaczących, więc niektóre z najmniej znaczących informacji są po cichu tracone. W tym przypadku, parser/silnik JavaScript JavaScript czyta w wartości literalnej.
Jedynym bezpiecznym sposobem obsługi liczb całkowitych o tej wielkości w JavaScript jest użycie ciągu literalnego lub rozbicie go w inny sposób (np. Niestandardowy typ liczbowy lub "bigint library"). Jednak Polecam po prostu za pomocą ciąg, ponieważ jest czytelny dla człowieka, stosunkowo niewielki (tylko dwa dodatkowe znaki w JSON), i nie wymaga specjalnej serializacji. Ponieważ wartość jest po prostu "id" w tym przypadku, mam nadzieję, że matematyka nie musi być wykonywane na nim :)
Happy kodowania.
niesamowite rzeczy! – VvDPzZ
+1 piękna odpowiedź. – alex
Warto zauważyć, że JSON ([RFC 4627] (http://www.ietf.org/rfc/rfc4627)) nie daje gwarancji, jaki zakres numerów konsumenci JSON są zobowiązani do reprezentowania, więc odpowiedź może być inna dla innych klientów: "Implementacja może ustanawiać limity w zakresie liczb". –
Nie możesz zrobić czegoś takiego jak 'long long' w C, jeśli o to pytasz. String jest prawdopodobnie lepszym rozwiązaniem. – Chad
Jest to zasadniczo takie samo jak to pytanie z wczoraj: http://stackoverflow.com/q/8641668/615754. JavaScript może reprezentować duże liczby, ale z dokładnością do 15 lub 16 cyfr. – nnnnnn
To nie jest JSON FCOL –