decimal 和 numeric (Transact-SQL)
具有固定有效位數和小數位數的數值資料類型。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
引數
decimal [ **(**p[ **,**s] )] 和 numeric[ **(**p[ **,**s] )]
固定有效位數和小數位數的數字。 當使用最大有效位數時,有效的值是從 - 10^38 +1 到 10^38 - 1。 decimal 的 ISO 同義字是 dec 和 dec(p、s)。 numeric 與 decimal 的功能相同。p (有效位數)
可儲存的最大十進位數總數,小數點左右兩側都包括在內。 有效位數必須是從 1 到最大有效位數 38 的值。 預設有效位數是 18。s (小數位數)
小數點右側所能儲存的十進位數。 這個數字會從 p 中減去,以判斷小數點左邊的最大位數。 小數點右側所能儲存的最大十進位數。 小數位數必須是從 0 到 p 的值。 只有在指定了有效位數時,才能指定小數位數。 預設小數位數是 0;因此,0 <= s <= p。 最大儲存體大小會隨著有效位數而不同。有效位數
儲存體位元組
1 - 9
5
10-19
9
20-28
13
29-38
17
轉換 decimal 與 numeric 資料
對於 decimal 和 numeric 資料類型,SQL Server 會將每個有效位數和小數位數的特定結合視為不同的資料類型。 例如,decimal(5,5) 和 decimal(5,0) 是視為不同的資料類型。
在 Transact-SQL 陳述式中,會使用必要的最小有效位數與小數位數,自動將有小數點的常數轉換成 numeric 資料值。 例如,常數 12.345 會轉換成有效位數 5、小數位數 3 的 numeric 值。
從 decimal 或 numeric 轉換到 float 或 real 可能會流失有效位數。 而從 int、smallint、tinyint、float、real、money 或 smallmoney 轉換成 decimal 或 numeric 可能會造成溢位。
依預設,SQL Server 在將數字轉換成有效位數與小數位數較小的 decimal 或 numeric 值時會使用四捨五入。 但是,如果 SET ARITHABORT 選項是 ON,SQL Server 會在發生溢位時產生錯誤。 只是流失有效位數與小數位數還不足以產生錯誤。
將浮點值或實數值轉換成十進位或數值時,十進位值一定不會超過 17 個小數位數。 任何浮點值若 < 5E-18 一律會轉換為 0。
範例
下列範例會使用 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
(1 row(s) affected)
請參閱
參考
DECLARE @local\_variable (Transact-SQL)