decimal 和 numeric (Transact-SQL)
本主题适用于:SQL Server(从 2008 开始)Azure SQL 数据仓库Azure SQL 数据仓库并行数据仓库
带固定精度和小数位数的数值数据类型。 小数和数值是同义词,可以互换使用。
decimal[ (p[ ,s] )] and numeric[ (p[ ,s] )]
固定精度和小数位数。 使用最大精度时,有效值的范围为 - 10^38 +1 到 10^38 - 1。 The ISO synonyms for decimal are dec and dec(p, s). 数值功能上等效于十进制。
p(精度)
最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。 该精度必须是从 1 到最大精度 38 之间的值。 默认精度为 18。
说明 |
---|
|
s (缩放)
小数点右边可以存储的十进制数字的位数。 此数减去从p以确定最多的小数点左侧的位数。 小数点右边可以存储的十进制数字的最大位数。 小数位数必须介于 0 到p。 仅在指定精度后才可以指定小数位数。 默认小数位数为 0;therefore, 0 <=></=>s <= p. 最大存储大小基于精度而变化。
精度 | 存储字节数 |
---|---|
1 - 9 | 5 |
10-19 | 9 |
20-28 | 13 |
29-38 | 17 |
说明 |
---|
|
有关十进制和数值数据类型,SQL Server考虑每个精度和小数位数为不同的数据类型的特定组合。 例如, decimal(5,5)和decimal(5,0)被视为不同的数据类型。
在Transact-SQL语句,自动转换为具有小数点的常数数值数据值,使用最小的精度和缩放必要。 例如,常量 12.345 转换为数值值,该值精度为 5,小数位数为 3。
从转换十进制或数值到float或实际可能会导致某些丢失精度。 从转换int, smallint, tinyint, float,实际, money,或smallmoney为十进制或数值也会导致溢出。
默认情况下,SQL Server使用时将转换到数值进行舍入十进制或数值具有较低的精度和小数位数的值。 但如果 SET ARITHABORT 选项为 ON,则发生溢出时,SQL Server 会产生错误。 若仅降低精度和小数位数,则不会产生错误。
在将 float 值或实数值转换为 decimal 或 numeric 类型时,decimal 值不会超过 17 位小数。 任何小于 5E-18 的 float 值总是会转换为 0。
下面的示例创建表使用十进制和数值数据类型。 值将插入每一列,并使用 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)