2012-05-17 12 views
7

Mein Problem ist wirklich einfach, aber ich bin mir nicht sicher, ob es eine "native" Lösung mit JSON.parse gibt.JSON.parse analysiert/konvertiert große Zahlen falsch

Ich erhalte diese Zeichenfolge aus einer API:

{ "key" : -922271061845347495 } 

Wenn ich verwende JSON.parse auf dieser Zeichenfolge, verwandelt es sich in diesem Objekt:

{ "key" : -922271061845347500 } 

Wie Sie sehen können, stoppt die Analyse, wenn die Zahl zu lang ist (Sie können dieses Verhalten überprüfen here). Es hat nur 15 exakte Ziffern, die letzte ist gerundet und diejenigen nach sind auf 0 gesetzt. Gibt es eine "native" Lösung, um den genauen Wert zu halten? (Es ist eine ID, so kann ich es nicht runden)

Ich weiß, ich kann Regex verwenden, um dieses Problem zu lösen, aber ich würde lieber eine "native" -Methode verwenden, wenn es existiert.

+1

Können Sie es zu einer Zeichenfolge machen? –

+0

Versuchen mit, '{ "Schlüssel": "-922271061845347495"}' – Jashwant

+1

Dies bietet mehrere Antworten: [Stack-Überlauf-Thread] [1] [1]: http://stackoverflow.com/ questions/209869/was-ist-der-akzeptiert-weg-zu-senden-64-bit-werte-über-json –

Antwort

15

Ihre Annahme, dass die Analyse nach bestimmten Ziffern stoppt, ist falsch.

Es sagt here:

In JavaScript sind alle Zahlen sind Gleitkommazahlen. JavaScript verwendet das Standard-8-Byte IEEE floating-point numerische Format, das den Bereich Mittel aus:

± 1,7976931348623157 × 10 - sehr groß, und ± 5 x 10 -324 - sehr klein.

Da JavaScript Gleitkommazahlen verwendet die Genauigkeit nur gewährleistet ist für ganze Zahlen zwischen: -9007199254740992 (-2) und 9007199254740992 (2)

Sie Nummer außerhalb der liegt "genauer" Bereich wird daher in die nächste Darstellung der JavaScript-Nummer konvertiert. Jeder Versuch, diese Zahl auszuwerten (mit JSON.parse, eval, parseInt) führt zu Datenverlust. Ich empfehle daher, dass Sie den Schlüssel als Zeichenfolge übergeben. Wenn Sie die API nicht steuern, reichen Sie eine Feature-Anforderung ein.

+0

Dies beantwortet jedoch nicht die Frage. "Gibt es eine native Lösung, um den genauen Wert zu halten?" –

+0

Die native Lösung wäre, einen eigenen JSON-Parser zu schreiben, der Zahlen als Strings parst. –

+0

@Salman A: Danke für Ihre Erklärungen und Ratschläge.Ich werde wahrscheinlich ein wenig warten, bevor ich meinen eigenen Parser mache und Schlüssel als Strings sende, die dann auf der api Seite in Zahlen zerlegt werden. – Simon