【问题标题】:Appropriate datatype for holding percent values?用于保存百分比值的适当数据类型?
【发布时间】:2011-02-15 06:42:28
【问题描述】:

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

【问题讨论】:

标签: sql-server types sqldatatypes


【解决方案1】:

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

  • 如果您要存储它们的等效小数(例如,100.00% 存储为 1.0000),我会将数据存储在带有 @ 的 decimal(5,4) 数据类型中987654322@ 约束确保值永远不会超过 1.0000(假设是上限)并且永远不会低于 0(假设是下限)。
  • 如果您要存储他们的面值(例如,100.00% 存储为 100.00),那么您应该使用带有适当CHECK 约束的decimal(5,2) .

结合一个好的列名,让其他开发者一目了然数据是什么,数据是如何存储在列中的。

【讨论】:

  • 不应该是decimal(5,2),其中2表示小数点后的位数吗?
  • @BorisCallens - 不敢相信这些年来我都错过了。是的,这是一个错字。 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)。
  • @JohnLBevan - 它用于存储它们的方式。如果值将按显示存储(例如100.00),那么您需要decimal(5,2)。如果这些值将被存储为分数(例如1.0000),那么您需要decimal(5,4)。将更新帖子。
  • @MichaelHanon - 取决于要求。 OP 显示 2 个小数位,所以我假设 99.99% 和 100.00% 是有效值。如果您想要 0 位小数的百分比,那么您可以使用 decimal(3,2) 将它们存储为分数,如果您要存储整数,则可以使用 tinyint。
【解决方案2】:
  • 保留为decimal
  • 如果您想限制范围,请添加检查约束(例如,在 0 到 100% 之间;在某些情况下,可能有正当理由超出 100% 甚至可能变成负数)。
  • 将值 1 视为 100%,将 0.5 视为 50% 等。这将允许任何数学运算按预期运行(即,与将值 100 用作 100% 不同)。
  • 根据需要修改精度和比例(这些是括号中的两个值columnName decimal(precision, scale)。精度表示数字中可以包含的总位数,比例表示小数点后有多少位,所以@ 987654326@ 是一个可以表示为#.## 的数字;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)
    )

进一步阅读:

【讨论】:

  • 嗯,我认为您的示例场景是错误的。对于(0.00% to 100.00%),您需要decimal(5,2),对于(0% to 100%) ,如果您不需要小数点,最好使用int。
  • 嘿@nacholibre;这些例子是正确的。需要注意的重要一点是100% 被保存为1.00;不像100.00。即 5 的 100% 是 5 => 1 x 5 = 5。 90 的 50% 是 45。0.5 x 90 = 45。希望这有助于澄清。
【解决方案3】:

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

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

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

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

DataFormatString="{}{0:P}"

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 这个问题在三年多前得到了相当高的接受率。如果您正在寻找旧问题来回答,请参考这里:stackoverflow.com/unanswered
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2018-11-02
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多