telefono - tipos de datos en mysql pdf
almacenando cantidades de dinero en mysql (7)
Quiero almacenar 3.50 en una tabla mysql. Tengo un flotador en el que lo guardo, pero se almacena como 3.5, no 3.50. ¿Cómo puedo conseguir que tenga el cero final?
¿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 el formato de las cifras / fechas / etc. deben realizarse en la aplicación, no en la base de datos.
¿Realmente importa si almacena es 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 estoy perdiendo algo aquí?
Tampoco uses un flotador, usa un decimal. Float tiene todo tipo de problemas de redondeo y no es muy grande.
Binario no puede representar con precisión puntos flotantes con solo un número limitado de bits. No es una pérdida de datos tan grande, pero en realidad errores de conversión ... Aquí está el manual que da ejemplos.
Puede ver esto en acción en su navegador, véalo usted 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 £ instead of pence, we can divide by 100 (presentation only) : £" + intSum/100 + "<br />");
</script>
En general, no es una buena idea almacenar el dinero como flotador, ya que los cálculos de redondeo pueden ocurrir.
Considere usar DECIMAL (10,2) en su lugar.
No almacene valores monetarios como flotante, use el tipo DECIMAL o NUMÉRICO:
Documentación para los tipos numéricos de MySQL
EDITAR y aclarar:
Los valores flotantes son vulnerables a los errores de redondeo, ya que tienen una precisión limitada, de modo que, a menos que no le importe, solo obtiene 9.99 en lugar de 10.00, debe usar DECIMAL / NUMERIC, ya que son números de puntos fijos que no tienen tales problemas.
Para almacenar valores puede usar un campo DECIMAL (10,2) , luego puede usar la función FORMAT :
SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1
Si usa tipos DECIMAL o NUMÉRICOS, puede declararlos como, por ejemplo, DECIMAL (18, 2), lo que forzaría 2 decimales incluso si fueran 0. Dependiendo de qué valores tan grandes, puede cambiar el valor del primer parámetro.