2010-05-04 12 views

Respuesta

82

Suponiendo dos decimales en sus porcentajes, el tipo de datos que usa depende de cómo planea almacenar sus porcentajes. Si vas a almacenar su equivalente fraccionario (por ejemplo, 100.00% almacenado como 1.0000), almacenaría los datos en un tipo de datos decimal(5,4) con una restricción CHECK que asegura que los valores nunca excedan 1.0000 (suponiendo que sea el límite) y nunca vayas debajo de 0 (suponiendo que sea el piso). Si va a almacenar su valor nominal (por ejemplo, 100.00% se almacena como 100.00), entonces debe usar decimal(5,2) con una restricción CHECK apropiada. Combinado con un buen nombre de columna, deja en claro a otros desarrolladores qué datos son y cómo se almacenan los datos en la columna.

+7

¿No debería ser 'decimal (5,2)' donde 2 denota el número de dígitos después del separador decimal? –

+2

@BorisCallens - No puedo creer que me haya perdido todos estos años. Sí, eso es un error tipográfico. 'decimal (5,2)' es lo que se debe capturar con una restricción de verificación. – Thomas

+0

Me alegro de ayudar :) –

2

Si 2 decimales es su nivel de precisión, entonces una "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 combinación. Entonces no necesita escalar manualmente. Toma 5 bytes por valor.

0

Use 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) 
+2

Esta pregunta tiene una respuesta aceptada bastante alta de hace más de tres años. Si está buscando preguntas antiguas para responder, consulte aquí: http://stackoverflow.com/unanswered – valverij

15
  • Hold como decimal.
  • Agregue restricciones de comprobación si desea limitar el rango (por ejemplo, entre 0 y 100%; en algunos casos, puede haber razones válidas para ir más allá del 100% o incluso en los negativos).
  • Trate el valor 1 como 100%, 0.5 como 50%, etc. Esto permitirá que las operaciones matemáticas funcionen como se espera (es decir, a diferencia del uso del valor 100 como 100%).
  • Modifique la precisión y la escala según sea necesario (estos son los dos valores entre paréntesis columnName decimal(precision, scale). Precisión dice el número total de dígitos que pueden contenerse en el número, la escala indica cuántos de ellos están después del decimal, entonces decimal(3,2) es número que puede representarse como #.##; decimal(5,3) sería ##.###
  • decimal y numeric son esencialmente la misma cosa Sin embargo decimal es ANSI compatible, por lo que siempre usar que, a menos que se lo indique (por ejemplo, por las normas de codificación de su empresa)
...

Escenarios de ejemplo

  • Para su caso (0.00% a 100.00%) desea decimal(5,4).
  • Para el caso más común (0% a 100%), querrá decimal(3,2).
  • En los dos, las restricciones de comprobación anteriores sería el mismo

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) 
    ) 

Lectura adicional:

1

Estoy de acuerdo con Thomas y yo elegiría la DECIMAL (5,4) Solución al menos para las aplicaciones de WPF.

Tenga una mirada a la MSDN Numérico Cadena Formato de saber por qué: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

El porcentaje ("P") especificador de formato multiplica un número por 100 y la convierte en una cadena que representa un porcentaje.

allí tendría que ser capaz de utilizar esto en su código XAML:

DataFormatString="{}{0:P}" 
Cuestiones relacionadas