2010-09-26 21 views
9

Tengo una tabla items en mi base de datos MySQL con un campo DECIMAL(10,2) llamado price.¿Se considera seguro trabajar con dinero (números decimales) en PHP?

Al obtener estos valores, ¿es seguro hacer cálculos y tal con estos números en PHP? ¿O terminaré con posibles errores de redondeo y cosas así que son comunes cuando trabajo con tipos de datos de coma flotante?

¿Cómo maneja PHP estas cosas detrás de la portada? ¿Es seguro hacer cálculos de dinero con PHP?

+0

PHP Pet Peeve # 1329: No datatype 'decimal'. AFAIK, detrás de la escena, PHP usará (gasp) aritmética de coma flotante. Entonces sí, se encontrará con [errores de redondeo] (http://stackoverflow.com/questions/3726721/php-math-precision/3726761#3726761). – NullUserException

+0

No hay idea acerca de php, pero sería mejor solo usar enteros. Es bastante fácil convertir de centavos a dólares (o lo que sea) según sea necesario más adelante. – CurtainDog

+0

¿Puede confiar en MySQL para los cálculos y en PHP solo para mostrar? – Xailor

Respuesta

8

Usted podría hacer uso de una librería PHP que hace matemáticas de precisión arbitraria, como BC Math o GMP.

Mientras usa centavos, o la unidad monetaria más pequeña posible funciona a veces, ¿qué pasa si se encuentra con una situación en la que debe lidiar con fracciones de centavos? Por ejemplo, si se trata de vender y comprar acciones, debe tener una mayor precisión que solo centavos. En situaciones como esta, debe hacer uso de matemática de precisión arbitraria.

+1

+1 para la mención de casos límite en los que trabajar con centavos por sí solo no funcionará – alex

10

La mayoría de las personas mide la moneda en la denominación más pequeña en PHP, por ejemplo, $ 10 dólares AU se mostrarían como 1000 centavos.

Es trivial obtener / 100 dólares, y no obtendrá, por ejemplo, 4.9999999 valores causados ​​por la aritmética de punto flotante.

Alternativamente, puede usar el punto flotante y redondear al valor de centavo mínimo más cercano (que puede ser un múltiplo de 5, por ejemplo).

Parece que ya saben sobre ello, pero para otros, this is still required reading :)

+1

La respuesta correcta y el idioma agnóstico en ese –

Cuestiones relacionadas