2010-08-10 2 views
9

He estado haciendo "Objeto del producto" para mi aplicación y he estado estableciendo atributos, cuando de repente llegué al atributo de precio y tropecé con la pregunta ¿qué tipo de opción elegir? Entiendo, que para PHP no importa tanto, pero digamos que para MySQL sí.
¿Alguna sugerencia?Precio de almacenamiento en PHP. ¿Qué es mejor doble o cuerda?

Respuesta

22

Los tipos de números reales son mejores para los números porque puede hacer comparaciones adecuadas con ellos (por ejemplo, precio < 10.0). Sin embargo, introducen problemas con precisión (cosas como 3.0 = 2.9999999999). En este caso, es mejor utilizar un tipo Decimal nativo, pero a falta de eso, almacenaría los precios como un número entero de centavos (por ejemplo, 6.77 => 677), luego dividir por 100 antes de presentar el número al usuario. De esta manera, obtienes las operaciones numéricas en la base de datos y obtienes la precisión (suponiendo que la precisión de 1 centavo sea suficiente).

+1

Eso es bastante buena técnica. – Eugene

0

La pregunta que siempre me hago al considerar los tipos de datos numéricos o de cadena (int, doble, etc.) es: "¿Voy a hacer cálculos matemáticos con ellos?" Si la respuesta es sí, y debo asumir que está en su caso, voy con el valor numérico. Si la respuesta es no, elijo el valor de la cadena.

1

Con la información que proporcione, parece mejor que simplemente utilice un número entero, por lo que puede ordenar y consultar con valores numéricos en lugar de valores de cadena. Un int sería mejor que un punto flotante ya que no tendría problemas raros de medio centavo.

es decir, usted no quiere que 6.77 sea mayor que 12.54, tampoco quiere algo con el precio 6.4312313141.

2

Hay una explicación detallada de las "mejores prácticas" para esta pregunta en this SO question. Usar números enteros también es una alternativa aceptable. De todos modos, es mejor utilizar la misma solución en toda la aplicación para facilitar la comparación y la aritmética.

Recuerde que siempre puede cambiar la apariencia de los datos antes de presentarlos al usuario, usando number_format() u otra cosa.

7

Ninguno es apropiado.

Los precios se deben almacenar como DECIMAL o INT, porque tienen un número fijo de puntos decimales. Usar flotadores no es una buena idea ya que los valores se redondearán. Las cadenas son problemáticas porque no podrás hacer comparaciones.

0

Personalmente, prefiero enteros para almacenarlo como valor de centavo, 650 en lugar de 6.50. Clasificación sencilla, sin problemas de redondeo y fácil de visualizar en cualquier formato para sus usuarios.

0

Es posible que desee comprobar el proyecto Time and Money en sourceforge. Divulgación completa: en realidad, no he estudiado mucho el proyecto, pero parece que le daría algunas buenas ideas sobre el manejo de tales cosas.

Cuestiones relacionadas