decimal 和 numeric (Transact-SQL)

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

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

参数

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

固定精度和小数位数。 使用最大精度时,有效值通过 -10^38 + 1 10^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和小数位数3 12.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