2011-05-11 14 views
6

Estoy tratando de manejar valores de JavaScript como 23.45, pero quiero poder hacer operaciones matemáticas sobre estos valores (suma, resta, multiplicación, división) sin toparme con problemas de punto flotante. Sí, podría necesitar redondear los resultados algunas veces, pero me gustaría que brinde respuestas razonables.¿Hay alguna buena moneda de JavaScript o clases de decimales?

considerar esto en javascript:

24.56 * .3 

Rendimientos

7.36799999999 

me gustaría que salga con 7.368.

La mayoría de los idiomas tienen un tipo de datos decimal o de divisa para tratar esto. ¿Alguien ha construido una clase que pueda manejar este tipo de datos de manera efectiva, o hay alguna otra solución para lidiar con este tipo de números sin tener que ajustar constantemente los errores de coma flotante?

Respuesta

2

En lugar de utilizar números enteros (que tienen sus propios problemas)

me gustaría utilizar la biblioteca bignumber.js

+1

Nice. Esto es lo que estaba buscando. Parece que no existía cuando originalmente hice la pregunta, pero ahí está ahora. –

2

Hay Math

El objeto Math es incorporar en la especificación JavaScript por lo que cada navegador tiene de forma nativa.

En cuanto a los tipos de datos, JavaScript tiene Number. Eso es. No tenemos otro tipo de datos numéricos. Lo mejor que se puede hacer es intentar trabajar con enteros.

11

enteros.

No es necesario para usar el punto flotante para la moneda. Use punto fijo, donde el número de puntos decimales es 0.

Cuenta en centavos (o posiblemente en décimas de centavos).

+0

Esto es útil. Sin embargo, esperaba que alguien ya hubiera hecho el arduo trabajo de crear algún tipo de clase/marco para tratar con una representación pseudo-decimal usando enteros. –

+1

@Jeff: Lo hicieron. Vivieron hace miles de años y descubrieron cómo multiplicar por 100. –

+0

La pregunta es sobre javascript. JS no tiene números enteros, todo es doble. http://stackoverflow.com/a/3605946/446536 – geon

1

ku4jQuery-kernel contiene tanto una clase de dinero como una utilidad matemática que contiene operaciones y redondeo, incluyendo round, roundUp y roundDown. Estos son buenos métodos porque puede pasar un valor para redondear a. Por ejemplo, puede hacer $ .math.round (3.4567, -2) y redondeará el número 3.4567 al 10^-2 más cercano. Lo mismo ocurre con dinero. $ .money (100.87) .divide (2) .roundUp(). toString() arrojará "$ 50.44". Puede ir más allá y agregar la denominación de dinero como un segundo parámetro, digamos "B" para Bitcoin, $ .money (100.87, "B"). Divide (2) .roundUp(). ToString(). Puede encontrar más información sobre esta biblioteca aquí ku4jQuery-kernel y más bibliotecas que puede encontrar útiles aquí kodmunki github. Estas bibliotecas se mantienen de cerca y se utilizan en muchos proyectos de producción. ¡Si decides probarlos, espero que los encuentres útiles! codificación feliz: {)}

1

nuevo chico en el bloque: moneysafe. Es de código abierto y utiliza un enfoque funcional que permite una composición inteligente.

$(.1) + $(.2) === $(.3).cents; 

https://github.com/ericelliott/moneysafe

Cuestiones relacionadas