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値が最も近い整数に丸められるのはなぜですか?
小数点のスケール/精度を定義していません。小数点以下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のドキュメントを参照してください。
これは、scaleを設定していないためです。つまり、システムはデフォルトのスケールであるゼロを使用しています。
s(スケール)小数点の右側に格納される小数点以下の桁数。この数値をpから減算して、小数点の左側の最大桁数を決定します。小数点の右側に保存できる10進数の最大数。スケールは、0からpまでの値でなければなりません。スケールを指定できるのは、精度が指定されている場合のみです。 デフォルトのスケールはです。 (強調追加)
つまり、SQL Serverは小数点の右側にゼロ桁を格納します。
精度を設定する
10進数(18,4)
これは小数になります
ここで質問は、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進数値の数を指定する必要はありませんが、独自の欠陥があります。
詳細については ここをクリック