Nosotros usamos double.
*jadear*
¿Por qué?
Porque puede representar cualquier número de 15 dígitos sin restricciones sobre dónde está el punto decimal . ¡Todo por unos miserables 8 bytes!
Entonces puede representar:
0.123456789012345
123456789012345.0
... y cualquier cosa en el medio.
Esto es útil porque estamos tratando con monedas globales , ydouble podemos almacenar los diversos números de decimales que probablemente encontraremos.
Un solo doublecampo puede representar 999,999,999,999,999s en yenes japoneses, 9,999,999,999,999.99s en dólares estadounidenses e incluso 9,999,999.999999999s en bitcoins
Si intenta hacer lo mismo con decimal, necesita lo decimal(30, 15)que cuesta 14 bytes.
Advertencias
Por supuesto, el uso doubleno está exento de advertencias.
Sin embargo, no es una pérdida de precisión como algunos tienden a señalar. Aunque doublepuede no ser internamente exacto al sistema base 10 , podemos hacerlo exacto redondeando el valor que extraemos de la base de datos a sus decimales significativos. Si es necesario, eso es. (por ejemplo, si se va a generar y se requiere una representación de base 10).
Las advertencias son que, cada vez que realizamos operaciones aritméticas con él, necesitamos normalizar el resultado (redondeándolo a sus decimales significativos) antes de:
- Realizando comparaciones en él.
- Escribiéndolo nuevamente en la base de datos.
Otro tipo de advertencia es que, a diferencia de decimal(m, d)donde la base de datos evitará que los programas inserten un número con más de mdígitos, no existen tales validaciones double. Un programa podría insertar un valor ingresado por el usuario de 20 dígitos y terminará siendo registrado silenciosamente como una cantidad inexacta.
deimal(10,2)es lo que uso ... puedes ajustar los valores dependiendo del tamaño esperado