簡體   English   中英

為什么我的十進制值在 SQL 插入中被四舍五入為整數?

[英]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 值四舍五入到最接近的整數?

您沒有為小數定義比例/精度。 如果您想要小數點后的 3 位數字,您應該將其定義為 DECIMAL(9,3),這將為您提供小數點前 6 位和最多 3 位小數。 您需要分析預期數據並根據預期為列定義指定正確的精度和小數位數。

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

請參閱此處的 Sql Server 文檔了解十進制

這是因為您沒有設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM