decimal и numeric (Transact-SQL)decimal and numeric (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Типы числовых данных с фиксированными точностью и масштабом.Numeric data types that have fixed precision and scale. Типы decimal и numeric являются взаимозаменяемыми синонимами.Decimal and numeric are synonyms and can be used interchangeably.

АргументыArguments

decimal[ ( p[ , s] ) ] и numeric[ ( p[ , s] ) ]decimal[ (p[ ,s] )] and numeric[ (p[ ,s] )]
Числа с фиксированной точностью и масштабом.Fixed precision and scale numbers. При использовании максимальной точности числа могут принимать значения в диапазоне от -10^38+1 до 10^38-1.When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1. Синонимами типа decimal по стандарту ISO являются типы dec и dec( p, s ) .The ISO synonyms for decimal are dec and dec(p, s). Тип numeric функционально эквивалентен типу decimal.numeric is functionally identical to decimal.

p (точность)p (precision)
Максимальное общее число хранимых десятичных разрядов.The maximum total number of decimal digits to be stored. Это число включает символы слева и справа от десятичной запятой.This number includes both the left and the right sides of the decimal point. Точность должна быть значением в диапазоне от 1 до максимум 38.The precision must be a value from 1 through the maximum precision of 38. Точность по умолчанию составляет 18.The default precision is 18.

Примечание

В Informatica поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.Informatica only supports 16 significant digits, regardless of the precision and scale specified.

s (масштаб)s (scale)
Максимальное число хранимых десятичных разрядов справа от десятичной запятой.The number of decimal digits that are stored to the right of the decimal point. Это число отнимается от p для определения максимального количества цифр слева от десятичной запятой.This number is subtracted from p to determine the maximum number of digits to the left of the decimal point. Масштаб должен иметь значение от 0 до p и может быть указан только при заданной точности.Scale must be a value from 0 through p, and can only be specified if precision is specified. По умолчанию масштаб принимает значение 0, поэтому 0 <= s <= p.The default scale is 0 and so 0 <= s <= p. Максимальный размер хранилища зависит от точности.Maximum storage sizes vary, based on the precision.

ТочностьPrecision Байты хранилищаStorage bytes
1–91 - 9 55
10–1910-19 99
20–2820-28 1313
29–3829-38 1717

Примечание

В Informatica (при подключении с помощью соединителя SQL Server PDW для Informatica) поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.Informatica (connected through the SQL Server PDW Informatica Connector) only supports 16 significant digits, regardless of the precision and scale specified.

Преобразование данных типов decimal и numericConverting decimal and numeric data

Для типов данных decimal и numericSQL ServerSQL Server обрабатывает каждое сочетание точности и масштаба как отдельный тип данных.For decimal and numeric data types, SQL ServerSQL Server considers each combination of precision and scale as a different data type. Например, значения decimal(5,5) и decimal(5,0) считаются разными типами данных.For example, decimal(5,5) and decimal(5,0) are considered different data types.

В инструкциях Transact-SQLTransact-SQL константа с десятичным разделителем автоматически преобразуется в значение типа numeric с минимальными необходимыми точностью и масштабом.In Transact-SQLTransact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. Например, константа 12,345 преобразуется в значение numeric с точностью 5 и масштабом 3.For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.

Преобразование типа данных decimal или numeric в тип float или real может привести к потере точности.Converting from decimal or numeric to float or real can cause some loss of precision. Преобразование типов данных int, smallint, tinyint, float, real, money или smallmoney в тип decimal или numeric может вызвать переполнение.Converting from int, smallint, tinyint, float, real, money, or smallmoney to either decimal or numeric can cause overflow.

По умолчанию SQL ServerSQL Server использует округление с потерей точности и масштаба при преобразовании числа в значение decimal или numeric.By default, SQL ServerSQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. И наоборот, при включенном (ON) параметре SET ARITHABORT в случае переполнения SQL ServerSQL Server вызывает ошибку.Conversely, if the SET ARITHABORT option is ON, SQL ServerSQL Server raises an error when overflow occurs. Для возникновения ошибки недостаточно только потери точности и масштаба.Loss of only precision and scale isn't sufficient to raise an error.

До версии SQL Server 2016 (13.x);SQL Server 2016 (13.x) точность преобразования значений float в decimal или numeric была ограничена 17 знаками.Prior to SQL Server 2016 (13.x);SQL Server 2016 (13.x), conversion of float values to decimal or numeric is restricted to values of precision 17 digits only. Любое значение типа float менее 5E-18 (в экспоненциальном представлении 5E-18 или десятичном представлении 0.0000000000000000050000000000000005) округлялось до 0.Any float value less than 5E-18 (when set using either the scientific notation of 5E-18 or the decimal notation of 0.0000000000000000050000000000000005) rounds down to 0. Начиная с версии SQL Server 2016 (13.x);SQL Server 2016 (13.x) это ограничение отсутствует.This is no longer a restriction as of SQL Server 2016 (13.x);SQL Server 2016 (13.x).

ПримерыExamples

В приведенном ниже примере создается таблица, в которой используются типы данных decimal и numeric.The following example creates a table using the decimal and numeric data types. Значения вставляются в каждый столбец.Values are inserted into each column. Результаты возвращаются с помощью инструкции SELECT.The results are returned by using a SELECT statement.

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;  
  

Результирующий набор:Here is the result set.

MyDecimalColumn                         MyNumericColumn  
--------------------------------------- ---------------------------------------  
123.00                                  12345.12000  
  
(1 row(s) affected)  
  

См. также разделSee also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)sys.types (Transact-SQL)