2012-05-17 14 views
7

Il mio problema è molto semplice ma non sono sicuro che esista una soluzione "nativa" che utilizza JSON.parse.JSON.parse analizza/converte erroneamente i numeri grandi

ricevo questa stringada un API:

{ "key" : -922271061845347495 } 

Quando uso JSON.parse su questa stringa, si trasforma in questo oggetto:

{ "key" : -922271061845347500 } 

Come si può vedere, l'analisi si interrompe quando il numero è troppo lungo (è possibile verificare questo comportamento here). Ha solo 15 cifre esatte, l'ultima è arrotondata e quelle successive sono impostate a 0. Esiste una soluzione "nativa" per mantenere il valore esatto? (è un ID quindi non posso arrotondarlo)

So che posso usare regex per risolvere questo problema, ma preferirei usare un metodo "nativo" se esiste.

+1

Riesci a farne una stringa? –

+0

Prova con, { "chiave": "-922.271.061.845,347495 millions"} '' – Jashwant

+1

Questo offre più risposte: [di stack overflow di discussione] [1] [1]: http://stackoverflow.com/ questions/209869/what-is-the-accepted-way-to-send-64-bit-values-over-json –

risposta

15

Il presupposto che l'analisi si interrompe dopo determinate cifre non è corretto.

Dice here:

numeri in virgola mobile

In JavaScript tutti i numeri sono. JavaScript utilizza 8 byte IEEE formato numerico a virgola mobile standard, che significa l'intervallo è da:

± 1,7976931348623157 x 10 - molto grande, e ± 5 x 10 -324 - molto piccola.

Come JavaScript utilizza numeri a virgola mobile la precisione è assicurata solo per numeri interi tra: -9007199254740992 (-2) e 9007199254740992 (2)

numero Si trova all'esterno del intervallo "preciso" quindi viene convertito nella rappresentazione più vicina del numero JavaScript. Qualsiasi tentativo di valutare questo numero (usando JSON.parse, eval, parseInt) causerà la perdita di dati. Pertanto ti consiglio di passare la chiave come stringa. Se non controlli l'API, invia una richiesta di funzionalità.

+0

Questo in realtà non risponde alla domanda, però. "Esiste una soluzione nativa per mantenere il valore esatto?" –

+0

La soluzione nativa sarebbe scrivere il proprio parser JSON che analizza i numeri come stringhe. –

+0

@ Salman A: Grazie per le tue spiegazioni e consigli.Probabilmente aspetterò un po 'prima di creare il mio parser e mandare le chiavi come stringhe e poi analizzarle in numero sul lato API. – Simon