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

保存0.00% 到100.00% 之间的百分比值的最佳数据类型是什么?

218681 次浏览

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

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

假设您的百分比上有两个小数位,您所使用的数据类型取决于您计划如何存储您的百分比:

  • 如果你要存储它们的 分数等价物(例如100.00% 存储为 10000) ,我会将数据存储在一个带有 CHECK约束的 decimal(5,4)数据类型中,以确保数值永远不会超过1.0000(假设这是上限) ,也永远不会低于0(假设这是最低值)。
  • 如果要存储它们的 面值(例如,100.00% 存储为 100.00) ,那么应该使用带有适当 CHECK约束的 decimal(5,2)

与一个好的列名相结合,可以让其他开发人员清楚地了解数据是什么,以及数据是如何存储在列中的。

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

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


select convert(money, @discount * @quantity)
  • 保持 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)
)

进一步阅读:

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

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

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

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

DataFormatString="{}{0:P}"