decimal 和 numeric (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

十进制数字 是具有固定精度和小数位数的数字数据类型。 十进制数字 是同义词,可以互换使用。

参数

decimal [ ( p [ , s ] ] ] 和 numeric [ ( p [, s ] ] ] ]

固定精度和小数位数。 使用最大精度时,有效值通过 -10^38 + 110^38 - 1。 十进制的 ISO 同义词是 dec 和 decp,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 数据类型,SQL Server 会将精度和确定位数的每个组合视为不同的数据类型。 例如,将 decimal(5,5) 和 decimal(5,0) 视为不同的数据类型 。

在 Transact-SQL 语句中,带有小数点的常量将自动转换为 numeric 数据值,而且使用必需的最小精度和小数位数。 例如,常量转换为数值,精度为5和小数位数312.345

转换为 转换风险
decimalnumeric floatreal 精度可能丢失
intsmallint、tinyintfloatrealmoneysmallmoney decimalnumeric 可能的溢出

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

在 SQL Server 2016(13.x)之前, 浮点 值转换为 十进制 值或 数值 仅限于精度为 17 位的值。 任何小于 5E-18 (使用科学表示法5E-18或小数表示法0.000000000000000005设置) 的浮点值向下舍入为 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