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 una CHECK
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 utilizarlo decimal(5,2)
con una CHECK
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.
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 que decimal(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 ejemplo 100% * 100% = 100%
, no 10000%
; 1 * 1 = 1
).
100.00
), entonces es necesario decimal(5,2)
. Si los valores se almacenarán como fracciones (por ejemplo 1.0000
), entonces necesita decimal(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 que decimal(3,2)
es un número que se puede representar como #.##
; decimal(5,3)
sería ##.###
. decimal
y numeric
son esencialmente lo mismo. Sin embargo decimal
, 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:
if object_id('Demo') is null
create table Demo
(
Id bigint not null identity(1,1) constraint pk_Demo primary key
, Name nvarchar(256) not null constraint uk_Demo unique
, SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
, SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
)
Otras lecturas:
0 to 1
vs 0 to 100
: C #: Almacenamiento de porcentajes, ¿50 o 0,50?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
El especificador de formato de porcentaje ("P") multiplica un número por 100 y lo convierte en una cadena que representa un porcentaje.
Entonces podrá usar esto en su código XAML:
DataFormatString="{}{0:P}"
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.
Utilice numérico (n, n) donde n tiene suficiente resolución para redondear a 1,00. Por ejemplo:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)