【发布时间】:2011-02-15 06:42:28
【问题描述】:
保存 0.00% 到 100.00% 范围内的百分比值的最佳数据类型是什么?
【问题讨论】:
-
还发现了这个相关的帖子:stackoverflow.com/questions/1602318/…
标签: sql-server types sqldatatypes
保存 0.00% 到 100.00% 范围内的百分比值的最佳数据类型是什么?
【问题讨论】:
标签: sql-server types sqldatatypes
假设您的百分比有两位小数,您使用的数据类型取决于您计划如何存储百分比:
decimal(5,4) 数据类型中987654322@ 约束确保值永远不会超过 1.0000(假设是上限)并且永远不会低于 0(假设是下限)。CHECK 约束的decimal(5,2) .结合一个好的列名,让其他开发者一目了然数据是什么,数据是如何存储在列中的。
【讨论】:
decimal(5,2),其中2表示小数点后的位数吗?
decimal(5,2) 应该使用检查约束来捕获。
decimal(5,4) 并在上述评论后更改为 decimal(5,2)... 我认为 decimal(5,4) 会是更好的定义 - 即你想存储 0 到 1 2 位小数,而不是 0 到 100。原因是百分比是 100;所以 100% 是 100/100,即 1。在大多数情况下这样做更有意义(例如 100% * 100% = 100%,而不是 10000%;1 * 1 = 1)。
100.00),那么您需要decimal(5,2)。如果这些值将被存储为分数(例如1.0000),那么您需要decimal(5,4)。将更新帖子。
decimal(3,2) 将它们存储为分数,如果您要存储整数,则可以使用 tinyint。
decimal。columnName decimal(precision, scale)。精度表示数字中可以包含的总位数,比例表示小数点后有多少位,所以@ 987654326@ 是一个可以表示为#.## 的数字;decimal(5,3) 将是##.###。decimal 和 numeric 本质上是一回事。但是decimal 符合 ANSI,因此除非另有说明(例如,按照贵公司的编码标准),否则请始终使用它。示例场景
decimal(5,4)。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)
)
进一步阅读:
【讨论】:
(0.00% to 100.00%),您需要decimal(5,2),对于(0% to 100%) ,如果您不需要小数点,最好使用int。
100% 被保存为1.00;不像100.00。即 5 的 100% 是 5 => 1 x 5 = 5。 90 的 50% 是 45。0.5 x 90 = 45。希望这有助于澄清。
我同意 Thomas 的观点,我至少会为 WPF 应用程序选择 DECIMAL(5,4) 解决方案。
查看 MSDN 数字格式字符串以了解原因: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
百分比(“P”)格式说明符将一个数字乘以 100 并将其转换为表示百分比的字符串。
然后你就可以在你的 XAML 代码中使用它了:
DataFormatString="{}{0:P}"
【讨论】:
如果 2 位小数是您的精度级别,那么“smallint”将在最小空间(2 字节)中处理此问题。您存储百分比乘以 100。
编辑:decimal 类型可能是更好的匹配。然后你不需要手动缩放。每个值占用 5 个字节。
【讨论】:
使用 numeric(n,n),其中 n 具有足够的分辨率以四舍五入到 1.00。例如:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)
【讨论】: