¿Cuál es el mejor tipo de datos para mantener valores porcentuales que van del 0,00% al 100,00%?
sql-server
types
sqldatatypes
Usuario
fuente
fuente
Respuestas:
Suponiendo dos lugares decimales en sus porcentajes, el tipo de datos que usa depende de cómo planea almacenar sus porcentajes. Si va a almacenar su equivalente fraccional (por ejemplo, 100,00% almacenado como 1,0000), almacenaría los datos en un
decimal(5,4)
tipo de datos con unaCHECK
restricción que garantiza que los valores nunca superen 1,0000 (suponiendo que ese es el límite) y que nunca bajen de 0 (asumiendo que es el piso). Si va a almacenar su valor nominal (por ejemplo, 100,00% se almacena como 100,00), entonces debería utilizarlodecimal(5,2)
con unaCHECK
restricción adecuada . Combinado con un buen nombre de columna, deja en claro a otros desarrolladores cuáles son los datos y cómo se almacenan en la columna.fuente
decimal(5,2)
donde 2 denota el número de dígitos después del separador decimal?decimal(5,2)
es lo que debe capturarse con una restricción de verificación.decimal(5,4)
y se cambiódecimal(5,2)
después del comentario anterior ... Creo quedecimal(5,4)
sería la mejor definición, es decir, desea almacenar de 0 a 1 con 2 lugares decimales, no de 0 a 100. La razón por la que es un porcentaje está fuera de 100; entonces 100% es 100/100 que es 1. Hacerlo de esta manera tiene más sentido para la mayoría de los casos (por ejemplo100% * 100% = 100%
, no10000%
;1 * 1 = 1
).100.00
), entonces es necesariodecimal(5,2)
. Si los valores se almacenarán como fracciones (por ejemplo1.0000
), entonces necesitadecimal(5,4)
. Actualizará la publicación.decimal
.columnName decimal(precision, scale)
. La precisión indica el número total de dígitos que se pueden contener en el número, la escala indica cuántos de ellos están después del lugar decimal, por lo quedecimal(3,2)
es un número que se puede representar como#.##
;decimal(5,3)
sería##.###
.decimal
ynumeric
son esencialmente lo mismo. Sin embargodecimal
, cumple con ANSI, así que utilícelo siempre a menos que se indique lo contrario (por ejemplo, según los estándares de codificación de su empresa).Escenarios de ejemplo
decimal(5,4)
.decimal(3,2)
.Ejemplo:
Otras lecturas:
0 to 1
vs0 to 100
: C #: Almacenamiento de porcentajes, ¿50 o 0,50?fuente
Estoy de acuerdo con Thomas y elegiría la solución DECIMAL (5,4) al menos para aplicaciones WPF.
Eche un vistazo a la cadena de formato numérico de MSDN para saber por qué: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Entonces podrá usar esto en su código XAML:
fuente
Si 2 lugares decimales es su nivel de precisión, entonces un "smallint" manejaría esto en el espacio más pequeño (2 bytes). Almacena el porcentaje multiplicado por 100.
EDITAR: El tipo decimal es probablemente una mejor coincidencia. Entonces no es necesario escalar manualmente. Toma 5 bytes por valor.
fuente
Utilice numérico (n, n) donde n tiene suficiente resolución para redondear a 1,00. Por ejemplo:
fuente