2012-05-17 22 views
7

Sorunum gerçekten basit ama JSON.parse kullanarak bir "yerli" çözüm varsa emin değilim.JSON.parse/ayrıştırır büyük sayılar dönüştürür yanlış

{ "key" : -922271061845347500 } 
:

{ "key" : -922271061845347495 } 

bu ipe JSON.parse kullanıyorum, bu nesneye dönüşür:

ben bir API bu dize almak numarası çok uzun zaman Gördüğünüz gibi

, ayrıştırma durdurur (bu davranışı kontrol edebilirsiniz here). Sadece 15 kesin basamağa sahip, sonuncusu yuvarlanmış ve sonradan 0'a ayarlanmış. Tam değeri korumak için "doğal" bir çözüm var mı? Ben bu sorunu çözmek için normal ifadeler kullanabilirsiniz biliyorum ama varsa bir "yerli" yöntemini kullanmayı tercih ediyorum

(o yüzden o yuvarlak edemez bir kimlik var). ayrıştırma durak belli basamak sonra yanlış olduğunu

+1

bunu bir dize yapabilir miyim? –

+0

, '{ "anahtar": "-922271061845347495"} ile deneyin' – Jashwant

+1

Bu çok cevabı sunmaktadır: [yığın taşma iplik] [1] [1]: http://stackoverflow.com/ sorular/209869/kabul edilen-gönder-gönder-64-bit-değerleri-json üzerine –

cevap

15

Sizin varsayım.

O here diyor ki:

JavaScript'inizde tüm sayılar vardır kayan nokta sayıları. - Çok büyük ve ± 5 x 10 -324 - çok küçük

± 1,7976931348623157 x 10 : JavaScript aralığı anlamına gelir standart 8 bayt IEEE kayan nokta sayısal format ila kullanır.

JavaScript doğruluk arasındaki tamsayılar için güvence okunur kayan noktalı sayıları kullanır gibi: -9007199254740992 (-2) ve 9007199254740992 (2)

Sen numarası dışında kalan "doğru" aralık, bu nedenle JavaScript numarasının en yakın temsiline dönüştürülür. Bu sayıyı değerlendirmeye yönelik herhangi bir girişim (JSON.parse, eval, parseInt kullanarak) veri kaybına neden olur. Bu yüzden anahtarı bir dizge olarak geçirmenizi tavsiye ederim. API'yi kontrol etmezseniz, bir özellik isteği gönderin.

+0

Aslında bu soruya cevap vermiyor. "Tam değeri korumak için yerel bir çözüm var mı?" –

+0

Yerel çözüm, sayıları dizeler olarak ayrıştıran kendi JSON ayrıştırıcınızı yazmak olacaktır. –

+0

@Salman A: Açıklamalarınız ve tavsiyeleriniz için teşekkür ederiz.Kendi ayrıştırıcımı yapmadan ve anahtarları anahtarlar olarak göndermeden ve api tarafında numaraya ayrıştırmadan önce biraz bekleyeceğim. – Simon

İlgili konular