2011-12-12 18 views
7

Estoy trabajando en una pequeña tienda en línea y estoy tratando de obtener el precio más bajo para un producto (fotos).SQL MIN() valor extraño

Así que comprobar para ver cuál es el precio más bajo es añadido (fotos se pueden pedir en diferentes tamaños):

SELECT 
    MIN(price) as price 
FROM 
    rm_prices 
WHERE 
    photo_id = '47' AND 
    price != '0' 

Esto devuelve el valor más bajo encontrado para este producto.

Cuando reviso mi db, veo que el valor más bajo es 1256.3.
Cuando imprimo mi resultado, el número proporcionado es 1256.30004882813.
El valor se establece como un FLOTADOR.

¿Por qué el resultado es 1256.30004882813 y no 1256.3?

+0

Mira esto, es muy importante saber cómo funciona realmente la aritmética de punto flotante, ya que te hará tropezar si solo asumes que siempre es "perfectamente exacto" ... http://citeseerx.ist.psu.edu/ viewdoc/summary? doi = 10.1.1.22.6768 – MatBailie

Respuesta

11

Debido a que el real number 1256,3 no se puede representar con precisión en floating point.

Debe utilizar un fixed-point datatype para datos monetarios. Citando el MySQL documentation:

Los DECIMAL y NUMERIC tipos almacenar valores numéricos exactos. Estos tipos se utilizan cuando es importante conservar la precisión exacta, , por ejemplo, con datos monetarios.

1

1256.3 no tiene una representación exacta en aritmética de coma flotante; por esa razón, generalmente es mejor almacenar sumas de dinero como INTEGER o DECIMAL tipos de datos.

Se puede encontrar más información en here.