2012-06-08 13 views
12

Esta pregunta se ha hecho muchas veces antes, pero he encontrado opiniones contradictorias sobre el tema, así que pensé en volver a plantearla con la esperanza de obtener una conclusión más unificada.Almacenamiento de valores de moneda en la base de datos MySQL

Me gustaría almacenar un valor de moneda en mi base de datos. Supongamos que todas las entradas son del mismo tipo de moneda (USD por ejemplo) y que se permiten tanto valores positivos como negativos.

Mi idea inicial era almacenar el valor como un entero con signo en términos de la unidad más pequeña de la moneda asociada. Por ejemplo, si deseo almacenar el valor $ 1.25, insertaría 125 en la base de datos, ya que la unidad más pequeña de USD es $ 0.01. Lo bueno de este método es que MySQL redondeará automáticamente al entero más cercano. Por ejemplo, si el valor en dólares es $ 1.259, podría insertar 125.9, que se redondearía automáticamente y se almacenaría como 126 o $ 1.26.

Entonces, ¿qué opinas? ¿Es este un enfoque sensato o hay una mejor manera?

+1

DECIMAL (p, s) 'http://dev.mysql.com/doc/refman/5.5/en/fixed-point-types.html – DavidO

+0

Ah, que tiene mucho más sentido. Entonces no hay necesidad de dividir por 100 antes de mostrar el número. ¡Gracias! –

Respuesta

13

Los datos financieros se pueden almacenar como DECIMAL(p,s) donde p es el número de dígitos significativos, y s es la escala (número de lugares a la derecha del punto decimal). Ver The MySQL documentation.

Además de O'Reilly de High Performance MySQL, capítulo 3:

"... se debe utilizar decimal sólo cuando se necesita resultados exactos para números fraccionarios - por ejemplo, al almacenar los datos financieros."

De Learning MySQL de O'Reilly:

DECIMAL es decir, "... Un tipo numérico utilizado comúnmente almacena un punto fijo número, como un salario o la distancia ...."

Y MySQL Pocket Reference:

DECIMAL" ... Sto res números de punto flotante donde la precisión es crítica, como para los valores monetarios ".

2

No hay nada de malo en el enfoque que describes. No hay correcto o incorrecto cuando se trata de esta pregunta.

Debe tener en cuenta que para mostrar $ valor al usuario, debe realizar siempre una operación de división o algún tipo de formateo.

¿Será más fácil depurar sus fórmulas/cálculos si todo estuviera en centavos o en dólares? ¿Mostrará los valores en centavos o dólares? etc.

Manténlo simple, pero de cualquier forma tendrás que usar un decimal.

+1

En realidad, si necesita precisión, no puede almacenarla como int, porque perderá valores fraccionarios, que son necesarios para cosas como impuestos del gobierno. – Alan

Cuestiones relacionadas