[英]Why are my decimal values being rounded to integers in SQL insertions?
我正在使用 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 值四舍五入到最接近的整數?
這是因為您沒有設置scale ,這意味着系統使用默認比例為零:
s(小數位數)將存儲在小數點右側的小數位數。 從 p 中減去該數字以確定小數點左側的最大位數。 小數點右側可以存儲的最大小數位數。 比例必須是從 0 到 p 的值。 只有在指定精度時才能指定比例。 默認比例為 0 。 (強調)
換句話說, SQL Server 在小數點右側存儲零位。
設置精度
十進制(18,4)
這將是小數
這里的問題是你如何定義 DECIMAL 列的精度?
如果是 DECIMAL(10, 2) 它將總共有 11 個數字,其中 2 個是十進制值(2 位小數四舍五入意味着 10.215 保存為 11.22,11.214 變為 11.21)。
如果它是 DECIMAL(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,您不必指定十進制值的數量,但它有其自身的缺陷。
欲了解更多詳情,您可以點擊這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.