2012-03-06 4 views
5

Estaba tratando de descubrir por qué uno de nuestros clientes en Facebook estaba teniendo problemas y lo remonté al número 10150141932135203 convirtiéndome en 10150141932135204, lo que nos dio resultados bastante inesperados.¿Por qué console.log (10150141932135203) imprime 10150141932135204 en Firefox y Chrome y cómo trato con valores enteros grandes como estos?

$ node 
> 10150141932135203 
10150141932135204 
> 10150141932135204 
10150141932135204 
> 10150141932135205 
10150141932135204 
> 10150141932135206 
10150141932135206 
> 10150141932135207 
10150141932135208 
> 10150141932135208 
10150141932135208 
> 10150141932135209 
10150141932135208 
> 10150141932135210 
10150141932135210 

¿Cómo puedo lidiar con números enteros de este tamaño?

+0

posible duplicado de [Javascript sumando enteros grandes] (http://stackoverflow.com/questions/4557509/javascript-summing-large-integers) y muchos, muchos otros – bernie

+0

@AdamBernier Ni siquiera estoy haciendo aritmética, pero si quizas. –

Respuesta

4

Si los números son mayores que lo que permite la especificación IEEE 754 (2), perderán precisión como lo demuestran sus ejemplos.

Puede usar una biblioteca Binary Coded Decimal para JavaScript, p. Ej. BCMathJs.

Esto, por supuesto, solo es aplicable si necesita realizar operaciones aritméticas en los números. Si no, mantenlos como cadenas.

+1

Esa biblioteca se convertirá en una locura popular ahora cuando cada aplicación de Facebook no podrá hablar de manera confiable con los UID de Facebook de ese tamaño. –

+2

@KitSunde Si no está realizando operaciones aritméticas, simplemente guárdelas como cadenas. – alex

+0

También tiene bibliotecas exclusivamente para enteros de cualquier tamaño que pueden ser más rápidos, por ejemplo, https://github.com/silentmatt/javascript-biginteger –

Cuestiones relacionadas