web-dev-qa-db-fra.com

Type de données approprié pour la conservation des valeurs de pourcentage?

Quel est le meilleur type de données pour contenir des valeurs de pourcentage allant de 0,00% à 100,00%?

84
User

En supposant deux décimales sur vos pourcentages, le type de données que vous utilisez dépend de la manière dont vous prévoyez de stocker vos pourcentages. Si vous voulez stocker leur équivalent fractionnaire (par exemple 100,00% stocké en tant que 1,0000), je stockerais les données dans un type de données decimal(5,4) avec une contrainte CHECK garantissant que les valeurs ne dépassent jamais 1,0000 (en supposant que ce soit le plafond) et ne descendez jamais en dessous de 0 (en supposant que ce soit le plancher). Si vous souhaitez stocker leur valeur faciale (par exemple, 100,00% est stocké sous la forme 100,00), vous devez utiliser decimal(5,2) avec une contrainte appropriée CHECK. Combiné à un bon nom de colonne, il indique clairement aux autres développeurs en quoi consistent les données et comment elles sont stockées dans la colonne.

106
Thomas
  • Tenir comme un decimal.
  • Ajoutez des contraintes de vérification si vous souhaitez limiter la plage (par exemple, entre 0 et 100%; dans certains cas, il peut exister des raisons valables d'aller au-delà de 100% ou même potentiellement dans les négatifs).
  • Traitez la valeur 1 comme 100%, 0,5 comme 50%, etc. Cela permettra à toutes les opérations mathématiques de fonctionner comme prévu (c'est-à-dire par opposition à l'utilisation de la valeur 100 comme 100%).
  • Modifiez la précision et l'échelle si nécessaire (il s'agit des deux valeurs entre parenthèses columnName decimal(precision, scale)). La précision indique le nombre total de chiffres pouvant être conservés dans le nombre, l'échelle indique le nombre de chiffres après la décimale, afin decimal(3,2) est un nombre qui peut être représenté par #.##; decimal(5,3) serait ##.###.
  • decimal et numeric sont essentiellement la même chose. Cependant, decimal est conforme à la norme ANSI, utilisez-le toujours, sauf indication contraire (par exemple, selon les normes de codage de votre entreprise).

Exemples de scénarios

  • Pour votre cas (0,00% à 100,00%), vous voudriez que decimal(5,4).
  • Dans le cas le plus courant (0% à 100%), vous voudriez que decimal(3,2).
  • Dans les deux cas, les contraintes de vérification seraient les mêmes.

Exemple:

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

Lectures supplémentaires:

19
JohnLBevan

Je suis d'accord avec Thomas et je choisirais la solution DECIMAL (5,4) au moins pour les applications WPF.

Consultez la chaîne de format numérique MSDN pour savoir pourquoi: http://msdn.Microsoft.com/en-us/library/dwhawy9k#PFormatString

Le spécificateur de format de pourcentage ("P") multiplie un nombre par 100 et le convertit en une chaîne représentant un pourcentage.

Vous pourrez alors utiliser ceci dans votre code XAML:

DataFormatString="{}{0:P}"
3
pjehan

Si votre niveau de précision est de 2 décimales, un "smallint" le traitera dans le plus petit espace disponible (2 octets). Vous stockez le pourcentage multiplié par 100.

EDIT: Le type décimal est probablement une meilleure correspondance. Ensuite, vous n'avez pas besoin de mettre à l'échelle manuellement. Il faut 5 octets par valeur.

2
mdma

Utilisez numérique (n, n) où n a une résolution suffisante pour arrondir à 1,00. Par exemple:

declare @discount numeric(9,9)
    , @quantity int
select @discount = 0.999999999
    , @quantity = 10000

select convert(money, @discount * @quantity)
0
user2202942