web-dev-qa-db-ja.com

パーセント値を保持するための適切なデータ型は?

0.00%から100.00%の範囲のパーセント値を保持するのに最適なデータ型は何ですか?

84
User

パーセンテージの小数点以下2桁を想定すると、使用するデータ型は、パーセンテージの格納方法によって異なります。それらの小数部分を保存する場合(たとえば、100.00%を1.0000として保存する場合)、値が1.0000を超えないことを保証するCHECK制約のあるdecimal(5,4)データ型にデータを保存します。それが上限です)、0未満にならないようにします(床であると仮定します)。額面を保存する場合(たとえば、100.00%は100.00として保存されます)、decimal(5,2)を適切なCHECK制約とともに使用する必要があります。適切な列名と組み合わせると、他の開発者に対して、データが何であり、データが列にどのように格納されるかが明確になります。

106
Thomas
  • decimalとして保持します。
  • 範囲を制限する場合は、チェック制約を追加します(例:0〜100%。場合によっては、100%を超えたり、場合によってはマイナスになったりする正当な理由があるかもしれません)。
  • 値1を100%、0.5を50%などとして扱います。これにより、数学演算が期待どおりに機能するようになります(つまり、値100を100%として使用するのではなく)。
  • 必要に応じて精度とスケールを修正します(これらは角かっこ内の2つの値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)
    )

さらに読む:

19
JohnLBevan

私はトーマスに同意し、少なくともWPFアプリケーションにはDECIMAL(5,4)ソリューションを選択します。

MSDN Numeric Format Stringを参照して理由を確認してください: http://msdn.Microsoft.com/en-us/library/dwhawy9k#PFormatString

パーセント( "P")形式指定子は、数値に100を掛けて、パーセントを表す文字列に変換します。

次に、XAMLコードでこれを使用できます。

DataFormatString="{}{0:P}"
3
pjehan

小数点以下2桁が精度のレベルである場合、「smallint」はこれを最小スペース(2バイト)で処理します。 100倍したパーセントを保存します。

編集: decimal タイプはおそらくより良い一致です。その後、手動でスケーリングする必要はありません。値ごとに5バイトかかります。

2
mdma

Numeric(n、n)を使用します。nには1.00に丸めるのに十分な解像度があります。例えば:

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

select convert(money, @discount * @quantity)
0
user2202942