適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉儲
Microsoft Fabric 中的 SQL 資料庫
decimal 和 numeric 是具有固定有效位數和小數位數的數值數據類型。 十進位 和 數值 是同義字,可以交替使用。
Arguments
decimal [ ( p [ , s ] ] ] 和 numeric [ ( p [ , s ] ]
固定有效位數和小數位數的數字。 使用最大有效位數時,有效值會從 -10^38 + 1 到 10^38 - 1。 十進位的 ISO 同義字是 dec 和 dec(p,s)。
numeric 在功能上與 decimal 相同。
p (精度)
要儲存的最大小數位數總數。 此數目包括小數點的左右兩側。 有效位數必須是從 1 到最大有效位數 38 的值。 預設有效位數是 18。
Note
Informatica 只支援 16 個有效數字,無論指定的有效位數和小數位數為何。
s (音階)
小數點右側所能儲存的小數位數。 這個數字會從 p 中減去,以判斷小數點左邊的最大位數。 小數位數必須是介於 0 到 p 間的值,且只能在已指定有效位數時指定。 預設小數字數為 0,因此 0 <= s <= p為 。 最大儲存體大小會隨著有效位數而不同。
| Precision | 儲存位元組 |
|---|---|
| 1 - 9 | 5 |
| 10-19 | 9 |
| 20-28 | 13 |
| 29-38 | 17 |
Note
Informatica (透過 SQL Server PDW Informatica Connector 連線) 只支援 16 個有效數字,無論指定的有效位數和小數位數為何。
轉換十進位和數值數據
針對 decimal 和 numeric 資料類型,SQL Server 會將每個有效位數和小數位數的結合視為不同資料類型。 例如,decimal(5,5) 和 decimal(5,0) 會視為是不同的資料類型。
在 Transact-SQL 陳述式中,會使用必要的最小有效位數與小數位數,自動將有小數點的常數轉換成 numeric 資料值。 例如,常數 12.345 會轉換成 數值 ,有效位數 5為 ,且小數字數為 3。
| 轉換 | 改裝為 | 轉換風險 |
|---|---|---|
| decimal 及 numeric | float 或 real | 可能遺失有效位數 |
| int、smallint、tinyint、float、real、money 或 smallmoney | decimal 及 numeric | 可能的溢出 |
根據預設,SQL Server 在將數字轉換成有效位數與小數位數較小的 decimal 或 numeric 值時會使用四捨五入。 相反地,如果 SET ARITHABORT 選項為 ON,SQL Server 會在發生溢位時引發錯誤。 只是流失有效位數與小數位數還不足以產生錯誤。
在 SQL Server 2016 (13.x) 之前, 浮點 數轉換成 十進位 值或 數值 僅限於有效位數 17 位數的值。 任何數值(使用 的科學表示法5E-18或小數表示法5E-18設定時)會向下四捨五入為 0.000000000000000005。 此限制不會出現在 SQL Server 2016 (13.x) 和更新版本中。
Examples
A. 使用十進位和數值數據類型建立數據表
下列範例會使用 decimal 和 numeric 資料類型建立資料表。 值會插入至每個資料行。 結果會使用 SELECT 語句傳回。
CREATE TABLE dbo.MyTable (
MyDecimalColumn DECIMAL(5, 2),
MyNumericColumn NUMERIC(10, 5)
);
GO
INSERT INTO dbo.MyTable
VALUES (123, 12345.12);
GO
SELECT MyDecimalColumn, MyNumericColumn
FROM dbo.MyTable;
結果集如下所示。
MyDecimalColumn MyNumericColumn
---------------- ----------------
123.00 12345.12000
B. 使用較低的有效位數和小數字數將 float 轉換為十進位
下列範例示範當轉換成小數點時,浮點數如何四捨五入,且有效位數和小數字數較低。
CREATE TABLE dbo.MyTable (
MyFloatColumn FLOAT,
MyDecimalColumn DECIMAL(10, 3)
);
GO
DECLARE @value FLOAT;
SELECT @value = 12345.123456789;
INSERT INTO dbo.MyTable
VALUES (@value, @value);
GO
SELECT MyFloatColumn, MyDecimalColumn
FROM dbo.MyTable;