2011-12-29 11 views
47

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?

+1

Nie możesz zrobić czegoś takiego jak 'long long' w C, jeśli o to pytasz. String jest prawdopodobnie lepszym rozwiązaniem. – Chad

+5

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

+0

To nie jest JSON FCOL –

Odpowiedz

84

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.

+2

niesamowite rzeczy! – VvDPzZ

+7

+1 piękna odpowiedź. – alex

+9

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". –