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

保持百分比值从0.00%到100.00%的最佳数据types是什么?

假设你的百分比有两位小数,你使用的数据types取决于你计划如何存储你的百分比。 如果你打算存储它们的小数部分(例如100.00%存储为1.0000),我会将数据存储在带有CHECK约束的decimal(5,4)数据types中,以确保值不超过1.0000(假设帽),从不低于0(假设是地板)。 如果要存储其面值(例如,100.00%存储为100.00),则应该使用具有适当CHECK约束的decimal(5,2) 。 结合一个好的列名,它使其他开发人员清楚数据是什么以及数据如何存储在列中。

  • 保持为decimal
  • 如果你想限制范围(例如0到100%之间;在某些情况下可能有正当的理由超过100%,甚至潜在的负面),添加检查约束。
  • 将数值1视为100%,将数值0.5视为50%等。这将允许任何math运算按照预期发挥作用(即,相对于将数值100作为100%)。
  • 根据需要修改精度和缩放比例(这些是括号中的两个数值columnName decimal(precision, scale) 。精度表示可以在数字中保留的位数的总数,scale表示在小数点后面有多less个数字, 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) ) 

进一步阅读:

  • 小数位数和精度: http : //msdn.microsoft.com/zh-cn/library/aa258832%28SQL.80%29.aspx
  • 0 to 10 to 100 : C#:存储百分比,50或0.50?
  • 小数对数字: SQL Server中DECIMAL和NUMERIC有什么区别吗?

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

编辑: 十进制types可能是一个更好的匹配。 那么你不需要手动缩放。 每个值需要5个字节。

我同意托马斯和我会selectDECIMAL(5,4)至less为WPF应用程序的解决scheme。

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

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

那么你可以在你的XAML代码中使用它:

 DataFormatString="{}{0:P}" 

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

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