用于保存百分比值的适当数据类型?

时间:2010-05-04 01:40:55

标签: sql-server types sqldatatypes

保持百分比值的最佳数据类型是0.00%到100.00%?

5 个答案:

答案 0 :(得分:102)

假设您的百分比有两个小数位,您使用的数据类型取决于您计划存储百分比的方式。如果你要存储它们的小数当量(例如100.00%存储为1.0000),我会将数据存储在decimal(5,4)数据类型中,其CHECK约束确保值不会超过1.0000(假设这是上限,永远不会低于0(假设是下限)。如果您要存储其面值(例如,100.00%存储为100.00),则应使用decimal(5,2)并使用适当的CHECK约束。结合良好的列名称,它使其他开发人员清楚地知道数据是什么以及数据如何存储在列中。

答案 1 :(得分:19)

  • 按住decimal
  • 如果要限制范围,请添加检查约束(例如,在0到100%之间;在某些情况下,可能有正当理由超出100%或甚至可能超出负数)。
  • 将值1视为100%,将0.5视为50%等。这将允许任何数学运算按预期运行(即,与使用值100作为100%相反)。
  • 根据需要修改精度和比例(这是括号columnName decimal(precision, scale)中的两个值。精度表示数字中可以保存的总位数,刻度表示其中有多少位于小数位后,因此decimal(3,2)是一个可以表示为#.##的数字; decimal(5,3)将是##.###
  • decimalnumeric基本上是一回事。但是decimal符合ANSI标准,因此除非另有说明(例如,通过贵公司的编码标准),否则请始终使用它。

示例场景

  • 对于您的情况(0.00%至100.00%),您需要decimal(5,4)
  • 对于最常见的情况(0%到100%),您需要decimal(3,2)
  • 在上述两种情况中,检查约束都是相同的

示例:

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

进一步阅读:

答案 2 :(得分:3)

我同意Thomas的意见,我会选择DECIMAL(5,4)解决方案至少用于WPF应用程序。

查看MSDN数字格式字符串以了解原因: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

  

百分比(" P")格式说明符将数字乘以100并将其转换为表示百分比的字符串。

然后你就可以在你的XAML代码中使用它了:

DataFormatString="{}{0:P}"

答案 3 :(得分:2)

如果2个小数位是你的精度水平,那么“smallint”将在最小的空间(2个字节)中处理这个。您存储百分比乘以100。

编辑:decimal类型可能是更好的匹配。那你就不需要手动缩放了。每个值需要5个字节。

答案 4 :(得分:0)

使用数字(n,n),其中n具有足够的分辨率以舍入到1.00。例如:

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

select convert(money, @discount * @quantity)