データベース内の数値の精度とスケールを解釈するにはどうすればよいですか?


245

データベースに次の列が指定されています:decimal(5,2)

これはどのように解釈されますか?

SQL Server Management Studioで表示される列のプロパティによると、10進数(数値の精度、数値のスケール)を意味することがわかります。

精度とスケールは、実際にはどういう意味ですか?

これを5桁と小数点以下2桁の10進数として解釈するのは簡単です...すなわち12345.12

PS同僚から正しい答えを特定することはできましたが、オンラインで答えを見つけるのが非常に困難でした。したがって、今後の参考のために、ここでStackoverflowに関する質問と回答を文書化したいと思います。

回答:


396

数値精度とは、数値に存在する最大桁数を指します。

つまり、1234567.89の精度は9です。

数値スケールは小数点以下の最大数を指します

つまり、123456.789のスケールは3です。

したがって、decimal(5,2)の最大許容値は999.99です


14
Microsoft Accessなどで、入力の精度とスケールをパーセントで事前定義できるシステムを使用している場合は、パーセントを整数形式にする必要があることを忘れないでください。この場合、25.5%は.255と見なす必要があるため、精度4とスケール3(1ではない)が必要です。私は早い段階でこの問題に遭遇し、なぜスケール1が機能しないのか疑問に思いました。
Ashton Sheets

1
@mezoid負のスケール値はどういう意味ですか?
オタク2014年

@Geek technet.microsoft.com/en-us/library/ms187746.aspxによるとスケールはゼロより小さくできません。0 <=スケール<=精度。基本的に、負のスケール値は意味がありません。
メゾイド2014年


1
「数値の精度とは、数値に含まれる可能性のある最大桁数を指します。」?正確な数値123.5も精度10にすることができますが、追加する桁はありません。または、これは123.5000000になりますか?
Chris311

86

数値の精度は、桁数です。

数値のスケールは、小数点以下の桁数です。

フィールド定義で精度とスケールを設定するときに一般的に暗示されるのは、それらが最大値を表すということです。

例:precision=5およびで定義された10進数フィールドscale=2は、次の値を許可します。

  • 123.45 (p = 5、s = 2)
  • 12.34 (p = 4、s = 2)
  • 12345 (p = 5、s = 0)
  • 123.4 (p = 4、s = 1)
  • 0 (p = 0、s = 0)

次の値は許可されていないか、データが失われる可能性があります。

  • 12.345(p = 5、s = 3)=>は12.35(p = 4、s = 2)に切り捨てられる可能性があります
  • 1234.56(p = 6、s = 2)=>は1234.6(p = 5、s = 1)に切り捨てられる可能性があります
  • 123.456(p = 6、s = 3)=>は123.46(p = 5、s = 2)に切り捨てられる可能性があります
  • 123450 (p = 6、s = 0)=>範囲外

範囲は一般に精度によって定義されることに注意してください:|value| < 10^p...


5
MS SQL Serverは、12345または1234.56を許可しないことに注意してください。「小数点の左側の最大桁数を決定するために、[精度]から[スケール]が減算される」ためです。(出典:10進数と数値
molnarm

いかが12345000ですか?精度5または8?5の場合、どのスケールで?スケール-3?
towi 2015年

@towiどういう意味ですか?これを保存する場合は、8,0を使用します。
Rob Grant

いい答えですが、なぜ123450 (p=6,s=0)範囲外ですか?123450には6桁の数字があり、ポイントの後に数字はありませんか?
Matthias Burger

1
@MatthiasBurger 123450 (p=6,s=0)は、(例で述べたように)5精度の10進数フィールドの範囲外になります。フィールドに格納する数値の精度は、フィールドの精度以下でなければならないためです。
Snozzlebert 2018年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.