web-dev-qa-db-ja.com

SQL挿入で小数値が整数に丸められるのはなぜですか?

SQL Server Management Studioを使用しており、次のスキーマが用意されています。

CREATE TABLE tmp(
    id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
    toleranceRegion DECIMAL
)

次に、次の挿入を実行します。

INSERT INTO tmp VALUES(3.2); 
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);

期待される出力:

id  toleranceRegion
--  ---------------
1   3.2
2   5.678
3   1.95

実際の出力:

id  toleranceRegion
--  ---------------
1   3
2   6
3   2

挿入されたtoleranceRegion値が最も近い整数に丸められるのはなぜですか?

14
Adam Freymiller

小数点のスケール/精度を定義していません。小数点以下3桁が必要な場合は、DECIMAL(9,3)として定義する必要があります。これにより、小数点の前に6桁、最大3桁の小数点が与えられます。 予想されるデータを分析し、予想に基づいて、列定義の正しい精度とスケールを指定する必要があります。

CREATE TABLE tmp(
    id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
    toleranceRegion DECIMAL(9,3)
)

ここでは10進数 については、SQL Serverのドキュメントを参照してください。

14
Igor

これは、scaleを設定していないためです。つまり、システムはデフォルトのスケールであるゼロを使用しています。

s(スケール)小数点の右側に格納される小数点以下の桁数。この数値をpから減算して、小数点の左側の最大桁数を決定します。小数点の右側に保存できる10進数の最大数。スケールは、0からpまでの値でなければなりません。スケールを指定できるのは、精度が指定されている場合のみです。 デフォルトのスケールはです。 (強調追加)

つまり、SQL Serverは小数点の右側にゼロ桁を格納します。

4
dasblinkenlight

精度を設定する

10進数(18,4)

これは小数になります

3

ここで質問は、DECIMAL列の精度をどのように定義したかです。

DECIMAL(10、2)の場合、合計11個の数字があり、そのうち2個は10進値です(10進数の2桁の丸めでは、10.215は11.22として保存され、11.214は11.21になります)。

DECIMAL(10)の場合、10進値はなく、整数に丸められます。

あなたの質問でtoleranceRegion DECIMALのようにテーブルを宣言すると、次の整数に丸められます

CREATE TABLE tmp(
id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
toleranceRegion DECIMAL(10,3)

その後、丸められず、あなたが望むように結果が得られます

INSERT INTO tmp VALUES(3.2); 
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);

出力:

id  toleranceRegion
--  ---------------
1   3.2
2   5.678
3   1.95

注:-FLOATまたはDOUBLE PRECISIONを使用する場合、10進数値の数を指定する必要はありませんが、独自の欠陥があります。

詳細については ここをクリック