decimal 和 numeric (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics 是并行数据仓库

带固定精度和小数位数的数值数据类型。 Decimal 和 numeric 是同义词,可互换使用。

参数

decimal[ (p[ ,s] )] 和 numeric[ (p[ ,s] )]
固定精度和小数位数。 使用最大精度时,有效值的范围为 - 10^38 +1 到 10^38 - 1。 decimal 的 ISO 同义词为 dec 和 dec(p,s) 。 numeric 在功能上完全等同于 decimal 。

p(精度)
要存储的十进制数字的总数上限。 此数目包括小数点的左右两侧。 该精度必须是从 1 到最大精度 38 之间的值。 默认精度为 18。

备注

Informatica 仅支持 16 位有效位数,无论指定精度和小数位数如何。

s(小数位数)
小数点右侧存储的十进制数字位数。 从 p 中减去此数字可确定小数点左边的最大位数 。 确定位数值必须介于 0 和 p 之间,只能在指定了精度的情况下指定此值。 默认的确定位数为 0;因此,0 <= s <= p 。 最大存储大小基于精度而变化。

Precision 存储字节数
1 - 9 5
10-19 9
20-28 13
29-38 17

备注

Informatica(通过 SQL Server PDW Informatica 连接器连接)仅支持 16 位有效位数,无论指定精度和小数位数如何。

转换 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 可能导致溢出 。

默认情况下,将数字转换为精度和小数位数较低的 decimal 或 numeric 值时,SQL Server 会进行舍入 。 反过来说,如果 SET ARITHABORT 选项为 ON,SQL Server 在发生溢出时抛出错误。 如果仅降低精度和确定位数,不足以抛出错误。

在进行 SQL Server 2016 (13.x) 之前,浮点值到 decimal 或 numeric 的转换仅限于精度为 17 位数字的值 。 小于 5E-18 的任何浮点 值(使用 5E-18 的科学计数法或 0.0000000000000000050000000000000005 十进制表示法设置时)都舍入为 0。 从 SQL Server 2016 (13.x) 起,不再具有该限制。

示例

下面的示例使用 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)  
  

另请参阅

ALTER TABLE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)