2010-05-04 213 views
64

保持百分比值从0.00%到100.00%的最佳数据类型是什么?适用于保存百分比值的数据类型?

+0

也发现了这个相关的职位:http://stackoverflow.com/questions/1602318/what-should-be-the -best-way-store-a-percent-value-in-sql-server – User 2010-05-16 21:20:48

回答

82

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

+7

不应该是'decimal(5,2)'其中2表示小数点分隔符后的位数? – 2012-06-15 13:20:36

+2

@BorisCallens - 不能相信我错过了这些年。是的,这是一个错字。 'decimal(5,2)'是应该用检查约束捕获的。 – Thomas 2012-06-15 16:19:21

+0

很高兴帮助:) – 2012-06-21 18:49:22

2

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

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

0

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

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

select convert(money, @discount * @quantity) 
+2

这个问题有相当高的评价从三年前接受的答案。如果你正在寻找旧的问题来回答,请参考这里:http://stackoverflow.com/unanswered – valverij 2013-07-29 21:14:46

15
  • 保持为decimal
  • 如果您想限制范围(例如0到100%;在某些情况下可能有正当理由超过100%或甚至可能超出负数),请添加检查约束。
  • 将值1视为100%,0.5视为50%等。这将允许任何数学运算按预期工作(即,与使用值100作为100%相反)。
  • 根据需要修改精度和缩放比例(这些是括号内的两个值columnName decimal(precision, scale)。精度表示可以在数字中保留的位数的总数,比例表示这些数字中有多少位在小数点后面,因此decimal(3,2)是这可以表示为#.##数; decimal(5,3)##.###
  • decimalnumeric基本上是相同的事情。然而decimal符合ANSI标准,因此请务必使用除非特别指出(由贵公司的编码标准EG)

示例方案

  • 对于您的情况(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) 
    ) 

进一步阅读:

1

我同意托马斯,我会选择十进制(5,4)解决方案,至少在WPF应用程序。

看一看在MSDN数字格式字符串知道为什么: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

的百分比(“P”)格式说明乘以100多家并将其转换为一个表示百分比的字符串。

然后你就可以在你的XAML代码使用此:

DataFormatString="{}{0:P}"