2010-02-12 18 views

Respuesta

89

No guarde los valores del dinero como flotador, utiliza el decimal o de tipo numérico:

Documentation for MySQL Numeric Types

EDITAR & aclaración:

valores flotantes son vulnerables a errores de redondeo se Tienen una precisión limitada por lo menos no le importa que solo obtenga 9.99 en lugar de 10.00 debe usar DECIMAL/NUMERIC ya que son números de punto fijo que no tienen tales problemas.

18

¿Realmente importa si almacena como 3.5, 3.50 o incluso 3.500?

Lo que es realmente importante es cómo se muestra después de que se recupera de la base de datos.

¿O me falta algo aquí?

Además, no use un flotador, use un decimal. Float tiene todo tipo de problemas de redondeo y no es muy grande.

+1

que se menciona la cuestión de redondeo. Mi punto era que no debería preocuparse por cómo se almacena sino cómo se muestra. No almacenaría la información financiera en 2 lugares decimales. Las tasas de cambio son 5 y almacenamos 6, pero solo se muestran como 2. –

+1

(comentario irrelevante anterior eliminado). +1 para un buen punto en el redondeo. –

4

¿Por qué quiere almacenar "3.50" en su base de datos? 3.5 == 3.50 == 3.5000 en lo que respecta a la base de datos.

Su presentación y formato de figuras/fechas/etc. debe hacerse en la aplicación, no en la base de datos.

5

Si utiliza tipos DECIMAL o NUMERIC, puede declararlos como por ejemplo DECIMAL (18, 2) que forzaría 2 decimales incluso si fueran 0. Dependiendo de qué tan grandes valores espera, puede cambiar el valor de la primer parámetro.

16

Para almacenar valores se puede utilizar un DECIMAL (10,2) campo, a continuación, puede utilizar la función FORMAT:

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1 
35

No es generalmente una buena idea para almacenar el dinero como un flotador como el redondeo los errores pueden ocurrir en los cálculos.

Considere utilizar DECIMAL (10,2) en su lugar.

+1

Incluso los números como 0.1 y 0.2 son imposibles de representar en coma flotante binario, sin importar la precisión. http: //en.wikipedia.org/wiki/Floating_point – Ray

0

Binario no puede representar con precisión puntos flotantes con solo un número limitado de bits. No es por lo que la pérdida de los datos muuch pero en realidad errores de conversión .. Here's the manual giving examples

Se puede ver esto en acción en su navegador, ver por sí mismo en este fragmento de código.

<script> 
 

 
    var floatSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     floatSum += 0.1; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*0.1; // 1 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />"); 
 

 

 
    // --- using integers instead --- 
 
    // Assume the example above is adding £0.10 ten times to make £1.00 
 
    // With integers, we will use store money in pence (100 pence (also written 100p) in £1) 
 

 
    var intSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     intSum += 10; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*10; // 100 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />"); 
 
    document.write("To display as &pound; instead of pence, we can divide by 100 (presentation only) : &pound;" + intSum/100 + "<br />"); 
 
</script>

Cuestiones relacionadas