2009-05-23 7 views
8

Estoy trabajando en algunos scripts de salida de informes que necesitan hacer algunos cálculos rudimentarios sobre algunos valores de dinero.¿Cómo puedo realizar cálculos relacionados con el dinero de forma segura en PHP?

Soy consciente de las limitaciones de la aritmética de coma flotante para este propósito, sin embargo, los valores de entrada son todos en formato decimal, así que si uso los operadores aritméticos en ellos, PHP los convertirá en flotantes.

Entonces, ¿cuál es la mejor manera de manejar los números? ¿Debo usar BCMath? ¿Hay algo parecido a Decimal en .NET? ¿O es seguro usar los operadores aritméticos si vuelvo a int?

+0

Es la razón por la cual Cobol todavía se usa mucho en el sector financiero. Puedes trabajar fácilmente con números de decimales. –

Respuesta

10

No trabaje en dólares ($ 1.54), trabaje en centavos: (154c). A menos que necesite realizar tareas donde las fracciones de un centavo son importantes, estará trabajando con enteros y todo estará bien. Si estás interesado en décimas de centavo, ¡entonces simplemente multiplica todo por diez!

+9

Generalización: use una unidad que sea atómica para su moneda. – SingleNegationElimination

+0

Para convertir una moneda, los bancos nos proporcionan las tasas con 8 decimales. –

+0

¿Qué tal para mostrar? Todavía necesita mostrarse como $ 1.54. ¿Hay alguna situación con un número de coma flotante donde terminaré con 1.53 o 1.55? – Shabbyrobe

8

Si utiliza BCMath, todos los valores se almacenarán en cadenas y se pasarán a las funciones como cadenas, del mismo modo que el resultado será una cadena. Por lo tanto, no es necesario realizar ninguna conversión, pero asegúrese de que el número asignado a la función sea un valor numérico de valor. Personalmente, si la matemática requiere una gran cantidad de precisión en el lado decimal, entonces use BCMath.

-4

Si trabaja con cantidades razonables (para una "persona normal"), no es probable que usar coma flotante sea un problema, especialmente si solo está agregando y restando cantidades, en lugar de hacerlo, por ejemplo, interés cálculos

Si está buscando una solución rápida, cambiar a entero no es probable que lo ayude; usted todavía tiene que lidiar con el desbordamiento. (Alguien editó aquí para mencionar que si PHP encuentra un número más allá de los límites del tipo entero, será interpreted as a float instead. ¡Pero entonces has vuelto al problema original de usar coma flotante!) Enteros de longitud arbitraria (GMP, a partir de ese punto página) puede ayudar.)

Básicamente, hacer esto de una manera a medias funciona en la mayoría de los casos, y es barato; hacerlo correctamente es un dolor serio. Mi sugerencia es considerar esto como un problema comercial: si alguien se queja de perder un centavo, deles un dólar, y no se moleste en comenzar con una solución real hasta que ahorre más dólares haciendo eso.

+2

Eso es incorrecto. Los puntos flotantes son incapaces de representar todos los números de base 10. Incluso con números pequeños y sumas/restas simples, puede obtener resultados incorrectos. – troelskn

+0

Los números de coma flotante redondeados pueden representar todos los números entre 0.01 y 1.00 (tenga en cuenta los dígitos significativos) bien. –

Cuestiones relacionadas