Estoy creando esta API, y la base de datos almacenará valores que representan uno de los siguientes:
- porcentaje
- promedio
- Velocidad
Sinceramente, no tengo idea de cómo representar algo con un rango entre 0 y 100% en números. Deberia ser
- 0.00 - 1.00
- 0.00 - 100.00
- cualquier otra alternativa que no conozco
¿Hay una opción clara para eso? ¿Una forma global de representar en bases de datos algo que va del 0 al 100% por ciento? Yendo más lejos, ¿cuál es el tipo correcto para él, flotante o decimal?
Gracias.
int
para representar centésimos o en unidades de Permyriad o ‱.Respuestas:
Tomaré la postura opuesta.
FLOAT
es para números aproximados, como porcentajes, promedios, etc. Debe formatear mientras muestra los valores, ya sea en el código de la aplicación o usando laFORMAT()
función de MySQL.Nunca pruebes
float_value = 1.3
; Hay muchas razones por las que eso fallará.DECIMAL
debe usarse para valores monetarios.DECIMAL
evita un segundo redondeo cuando un valor debe redondearse a dólares / centavos / euros / etc. A los contadores no les gustan las fracciones de centavos.La implementación de MySQL
DECIMAL
permite 65 dígitos significativos;FLOAT
da aproximadamente 7 yDOUBLE
aproximadamente 16. 7 es generalmente más que suficiente para sensores y cálculos científicos.En cuanto al "porcentaje": a veces lo he usado
TINYINT UNSIGNED
cuando quiero consumir solo 1 byte de almacenamiento y no necesito mucha precisión; a veces he usadoFLOAT
(4 bytes). No hay ningún tipo de datos ajustado específicamente para el porcentaje. (Tenga en cuenta también queDECIMAL(2,0)
eso no puede contener el valor100
, por lo que técnicamente necesitaríaDECIMAL(3,0)
).O, a veces, he usado un
FLOAT
valor que tenía un valor entre 0 y 1. Pero tendría que asegurarme de multiplicar por 100 antes de mostrar el "porcentaje".Más
Los tres "porcentaje, promedio, tasa" huelen a flotadores, así que esa sería mi primera opción.
Un criterio para decidir el tipo de datos ... ¿Cuántas copias del valor existirán?
Si tiene una tabla de mil millones de filas con una columna para un porcentaje, considere que
TINYINT
tomaría 1 byte (1 GB en total), peroFLOAT
tomaría 4 bytes (4 GB en total). OTOH, la mayoría de las aplicaciones no tienen tantas filas, por lo que esto puede no ser relevante.Como regla 'general', los valores "exactos" deben usar alguna forma de
INT
oDECIMAL
. Las cosas inexactas (cálculos científicos, raíces cuadradas, división, etc.) deben usarFLOAT
(oDOUBLE
).Además, el formato de la salida generalmente se debe dejar al front-end de la aplicación. Es decir, a pesar de que un "promedio" puede calcular a "14.6666666 ...", la pantalla debería mostrar algo así como "14.7"; Esto es más amigable para los humanos. Mientras tanto, tiene el valor subyacente para decidir más tarde que "15" o "14.667" es el formato de salida preferible.
El rango "0.00 - 100.00" se puede hacer con
FLOAT
y utilizando el formato de salida o conDECIMAL(5,2)
(3 bytes) con la determinación previa de que siempre querrá la precisión indicada .fuente
En general, recomendaría no usar
float
. Los números de coma flotante representan números en base-2, lo que hace que algunos números (exactos) se redondeen en operaciones o comparaciones, porque simplemente no pueden almacenarse con precisión en base-2. Esto puede conducir a comportamientos sorprendentes.Considere el siguiente ejemplo :
La comparación de base 2 del número
1.3
falla. Esto es complicadoEn comparación, el decimal proporciona una representación precisa de números finitos dentro de su rango. Si cambia
float
adecimal(2, 1)
en el ejemplo anterior, obtendrá los resultados esperados.fuente
La diferencia entre flotante y decimal es la precisión. Decimal puede representar 100% con precisión cualquier número dentro de la precisión del formato decimal, mientras que Float no puede representar con precisión todos los números.
Use Decimal para, por ejemplo, el valor financiero relacionado y use flotante para, por ejemplo, el valor gráfico relacionado
fuente
Recomiendo usarlo
decimal(5,2)
si lo va a almacenar de la misma manera que lo mostrará, ya quedecimal
es para preservar la precisión exacta. (Ver https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )
https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
fuente
Decimal: en el caso de las aplicaciones financieras, es mejor usar tipos Decimal porque le brinda un alto nivel de precisión y es fácil evitar errores de redondeo
Doble: los tipos dobles son probablemente el tipo de datos más utilizado para valores reales, excepto el manejo de dinero.
Flotante: se utiliza principalmente en bibliotecas gráficas porque las demandas de potencia de procesamiento son muy altas, también se utilizan situaciones que pueden soportar errores de redondeo.
Referencia: http://net-informations.com/q/faq/float.html
fuente
El decimal hizo exactamente lo que se supone que debe hacer en estos casos, truncó el resto, perdiendo así la parte 1/3.
Entonces, para las sumas, el decimal es mejor, pero para las divisiones, el flotador es mejor, hasta cierto punto, por supuesto. Quiero decir, usar DECIMAL no te dará "aritmética a prueba de fallas" de ninguna manera.
Espero que esto sea de ayuda.
fuente
En tsql: Float, 0.0 almacena como 0 y no requiere definir después del dígito del punto decimal, por ejemplo, no necesita escribir Float (4,2). Decimal, 0.0 almacena como 0.0 y tiene la opción de definir como decimal (4,2), sugeriría 0.00-1.00, al hacer esto puede calcular el valor de ese porcentaje sin multiplicar por 100, y si informa, configure el tipo de datos de esa columna como porcentaje como MS Excel y otras vistas de plataforma
0.5 -> 50%
.fuente