Estoy transfiriendo datos brutos como [{id: 12000000000002539, Name: "Some Name"}]
y estoy obteniendo el objeto [{id: 12000000000002540, Name: "Some Name"}]
después del análisis, por ahora el lado del servidor convirtiendo el ID en cadena parece ayudar. ¿Pero existe una mejor manera de transferir correctamente los datos de Bigint?transferencia JSON de bigint: 12000000000002539 se convierte a 12000000000002540?
Respuesta
El valor es en realidad no exceda el valor numérico máximo en JavaScript (que es "sólo" 1,7 o algo así).
Sin embargo, el valor es que supera el rango de "precisión integral". No es que el número incorrecto se envía: más bien, es que el literal sólo puede ser representado con tanta precisión como 12000000000002540, y por lo tanto no fue nunca se el valor numérico correcto en JavaScript. (El range of integrals es de aproximadamente +/- 2 .)
Este es un fenómeno interesante de la utilización de a double relative-precision (binary64 en IEEE-754 Hablar) escriba para almacenar todos los valores numéricos, incluyendo los números enteros:
12000000000002539 === 12000000000002540 // true
El número máximo significativo de dígitos decimales que se almacenan con precisión como un valor numérico es 15 (15,95, realmente). En lo anterior, hay 17 dígitos significativos, por lo que algunos de la información menos significativa se pierde silenciosamente. En este caso, como el analizador/motor de JavaScript lee en el valor literal.
La única manera segura de manejar números enteros de esta magnitud en JavaScript es utilizar un literal de cadena o dividirlo de otra manera (por ejemplo, un tipo numérico personalizado o un "bigint library"). Sin embargo, recomiendo simplemente usar una cadena, ya que es legible por humanos, relativamente compacto (solo dos caracteres adicionales en JSON), y no requiere serialización especial. Dado que el valor es solo un "id" en este caso, espero que las matemáticas no necesiten ser ejecutadas :)
Happy coding.
¡cosas increíbles! – VvDPzZ
+1 hermosa respuesta. – alex
Vale la pena señalar que JSON ([RFC 4627] (http://www.ietf.org/rfc/rfc4627)) no garantiza el rango de números que los consumidores de JSON deben poder representar para que la respuesta sea diferente para otros clientes: "Una implementación puede establecer límites en el rango de números". –
- 1. Convierte de UniqueIdentifier a BigInt y Atrás?
- 2. Convierte un bigint en una cadena en Go
- 3. Convierte cadena al objeto JSON
- 4. Cambio de INT a BigInt
- 5. ¿Convierte json en una matriz de C#?
- 6. En JQuery 1.4.2 .ajax convierte JSON incorrectamente
- 7. Jackson JSON convierte enteros en cadenas
- 8. ¿Cómo se convierte una fracción a binaria?
- 9. ¿Cómo se convierte LPCWSTR a const char *?
- 10. ¿Cómo se convierte cstring a NSString?
- 11. C# A Bigint al azar generador de
- 12. F # tubería hacia adelante para convertir de int a bigint
- 13. SQL - downcast con seguridad BIGINT a INT
- 14. Mysql se convierte en '?
- 15. Convierte latin1 a UTF8
- 16. ¿Convertir cadena binaria a bigint en MySQL?
- 17. Transferencia de archivos a través de HTTP
- 18. Transferencia de uno FlowDocument a Segunda FlowDocument
- 19. Convierte System.Drawing.Image a System.Windows.Controls.Image?
- 20. Convierte Char a Int
- 21. Convierte PrintStream a PrintWriter
- 22. Convierte BitSet a int
- 23. Convierte cadena a datetime
- 24. ¿Convierte NSString a NSInteger?
- 25. Convierte XDocument a Stream
- 26. Convierte BSTR a char *
- 27. Convierte de char * a NSString?
- 28. ¿C++ se convierte en MSIL?
- 29. ¿Cómo se convierte una cadena de C++ a un int?
- 30. ¿Se convierte cada programa de Objective C a código C?
No puede hacer algo así como 'long long' en C si eso es lo que está preguntando. Cadena es probablemente la mejor manera de ir. – Chad
Esto es esencialmente lo mismo que esta pregunta de ayer: http://stackoverflow.com/q/8641668/615754. JavaScript puede representar números grandes, pero con solo unos 15 o 16 dígitos de precisión. – nnnnnn
No es JSON FCOL –