Quel est le meilleur type de données pour contenir des valeurs de pourcentage allant de 0,00% à 100,00%?
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.
decimal
.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
decimal(5,4)
.decimal(3,2)
.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:
0 to 1
Vs 0 to 100
: C #: Enregistrement des pourcentages, 50 ou 0,50?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}"
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.
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)