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


回答:


132

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


12
decimal(5,2)2は、小数点記号の後の桁数を表すのではないですか?
Boris Callens

2
@BorisCallens-ここ数年、私はそれを逃したなんて信じられません。はい、それはタイプミスです。decimal(5,2)は、チェック制約でキャプチャする必要があるものです。
トーマス

4
私はこれが元々あったdecimal(5,4)decimal(5,2)思いますdecimal(5,4)が、上記のコメントの後に変更されました...私はより良い定義だと思います-つまり、0から100ではなく、小数点以下2桁で0から1を格納したいのです。パーセンテージである理由は100; したがって、100%は100/100、つまり1です。この方法でこれを行うと、ほとんどの場合(たとえば100% * 100% = 100%10000%; ではない1 * 1 = 1)でより理にかなっています。
JohnLBevan 2014年

4
@JohnLBevan-それはそれらがどのように保存されているかに費やします。値が表示されたとおりに格納される場合(例:)100.00、必要になりますdecimal(5,2)。値が分数として格納される場合(例:)1.0000、必要になりますdecimal(5,4)。投稿を更新します。
トーマス

なぜあなたは小数点以下4桁が必要なのか説明できますか?あなたは2を使用することはできませんか?.91 === 91%または1.00 === 100%のように。私はこれを今実装していて、4か所での利益を考えていました。Pct decimal(10、2)CHECK(Pct> =。01 AND Pct <= 1)のようなもの。前もって感謝します。
MH

31
  • として保持します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)
    )

参考文献:


4

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

その理由を知るには、MSDN数値フォーマット文字列を見てください。http//msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

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

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

DataFormatString="{}{0:P}"

2

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

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


Microsoftはそのリンクの多くを壊してしまった.....
pcnate

0

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

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

select convert(money, @discount * @quantity)

3
この質問には、3年以上前からかなり高い評価を受けた回答があります。古い質問の答えを探している場合は、ここを参照してください:stackoverflow.com/unanswered
valverij
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.