7

これはかなり簡単です。以下のコードで以下のエラーが発生するのはなぜですか?

declare @dTest decimal(10, 9)
set @dTest = 50

エラー:

Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.

のMSDNドキュメントによるとdecimal(p, s)、 (または私の場合は10)は「小数点の左側と右側の両方にp格納できる10進数の最大合計数」ですが、(または私の場合は9)は「小数点の右側に格納できる小数点以下の最大桁数」。s

私の番号 50 は、合計 2 桁 (最大10 未満) しかなく、小数点以下 0 桁 (最大9未満) であるため、機能するはずです。

本質的に同じ問題に関するこの質問を見つけましたが、ドキュメントが動作と競合しているように見える理由を誰も説明しませんでした。次元は実際には小数点の右側の固定桁数sとして解釈され、 p番号から差し引かれているようです。私の場合、左側を処理するために 10 - 9 = 1 桁しか残っていません。

動作に一致するように書かれたドキュメントを解釈する合理的な方法を誰かが提供できますか?

編集:

以下にいくつかの説明がありますが、ドキュメントの文言に関する根本的な問題に対処していません。文言を次のように変更することをお勧めします。

「p (精度)」の「格納できる 10 進数の最大総数」を「格納される 10 進数の最大総数」に変更します。

そして、「s(位取り)」については「小数点以下に格納できる小数点以下の最大桁数」を変更します。「小数点の右側に格納される 10 進数の桁数この数値を p から減算して、小数点の左側の最大桁数を決定します。」

誰かがより良い説明を持っていない限り、Connect にバグ レポートを提出するつもりです。

4

5 に答える 5

12

10 ~ 9 は 1.DECIMAL(10, 9)の形式で数値を保持できます0.000000000。50 は小数点の前に 2 桁あるため、範囲外です。あなたはそれを自分で引用しました:

decimal(p, s) に関する MSDN のドキュメントによると、p (または私の場合は 10) は「小数点の左側と右側の両方に格納できる 10 進数の最大合計数」ですが、s (または私の場合は9)は、「小数点の右側に格納できる10進数の最大数」です。

于 2012-08-30T23:58:40.003 に答える
7

Connect にバグ レポートを送信しました: Decimal データ型に関する誤解を招くドキュメント

于 2012-08-31T00:29:23.913 に答える
2

ドキュメントを解釈する合理的な方法は、末尾の 10 進数のゼロは無視されないということです。したがって、数値の小数点の右側には 9 桁の数字があり、たまたま0.

于 2012-08-31T00:00:06.040 に答える
1

以下のリンクをご覧ください。 http://msdn.microsoft.com/en-gb/library/ms190476.aspx

精度は、数値の桁数です。スケールは、数値の小数点の右側の桁数です。たとえば、数値123.45の精度は5、スケールは2です。

于 2013-03-16T10:18:26.740 に答える
1

DECIMAL(10, 9)精度と位取りが固定された数値データ型です。これは、小数点の右側に常に同じ桁数を格納することを意味します。したがって、指定したデータ型は、小数点の左側に 1 桁、右側に 9 桁の数字のみを格納できます。明らかに、50その形式の数には適合しません。

于 2012-08-31T00:00:51.137 に答える