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

Aplica-se a:Applies to: simSQL ServerSQL Server (todas as versões compatíveis) yesSQL ServerSQL Server (all supported versions) SimBanco de Dados SQL do AzureAzure SQL DatabaseYesBanco de Dados SQL do AzureAzure SQL Database SimInstância Gerenciada do Azure SQLAzure SQL Managed InstanceYesInstância Gerenciada do Azure SQLAzure SQL Managed Instance simAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics simParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseAplica-se a:Applies to: simSQL ServerSQL Server (todas as versões compatíveis) yesSQL ServerSQL Server (all supported versions) SimBanco de Dados SQL do AzureAzure SQL DatabaseYesBanco de Dados SQL do AzureAzure SQL Database SimInstância Gerenciada do Azure SQLAzure SQL Managed InstanceYesInstância Gerenciada do Azure SQLAzure SQL Managed Instance simAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics simParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Tipos de dados numéricos que têm precisão e escala fixos.Numeric data types that have fixed precision and scale. Decimal e numeric são sinônimos e podem ser usados intercambiavelmente.Decimal and numeric are synonyms and can be used interchangeably.

ArgumentosArguments

decimal[ ( p[ , s] ) ] e numeric[ ( p[ , s] ) ]decimal[ (p[ ,s] )] and numeric[ (p[ ,s] )]
Números de precisão e escala fixos.Fixed precision and scale numbers. Quando a precisão máxima for usada, os valores válidos serão de - 10^38 +1 a 10^38 - 1.When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1. Os sinônimos ISO para decimal são dez e dec( p, s ) .The ISO synonyms for decimal are dec and dec(p, s). numeric é funcionalmente equivalente a decimal.numeric is functionally identical to decimal.

p (precisão)p (precision)
O número total máximo de dígitos decimais a ser armazenados.The maximum total number of decimal digits to be stored. Esse número inclui o que está à direita e à esquerda do ponto decimal.This number includes both the left and the right sides of the decimal point. A precisão deve ser um valor de 1 até a precisão máxima de 38.The precision must be a value from 1 through the maximum precision of 38. A precisão padrão é 18.The default precision is 18.

Observação

Informatica é compatível apenas com 16 dígitos significativos, independentemente da precisão e da escala especificadas.Informatica only supports 16 significant digits, regardless of the precision and scale specified.

s (escala)s (scale)
O número máximo de dígitos decimais que são armazenados à direita do ponto decimal.The number of decimal digits that are stored to the right of the decimal point. Esse número é subtraído de p para determinar o número máximo de dígitos à esquerda do separador decimal.This number is subtracted from p to determine the maximum number of digits to the left of the decimal point. A escala deve ser um valor de 0 a p, e só poderá ser especificada se a precisão for definida.Scale must be a value from 0 through p, and can only be specified if precision is specified. A escala padrão é 0; portanto, 0 <= s <= p.The default scale is 0 and so 0 <= s <= p. Os tamanhos máximos de armazenamento variam, com base na precisão.Maximum storage sizes vary, based on the precision.

PrecisãoPrecision Bytes de armazenamentoStorage bytes
1 - 91 - 9 55
10–1910-19 99
20–2820-28 1313
29-3829-38 1717

Observação

Informatica (conectado por meio do conector do SQL Server PDW Informatica) é compatível apenas com 16 dígitos significativos, independentemente da precisão e da escala especificadas.Informatica (connected through the SQL Server PDW Informatica Connector) only supports 16 significant digits, regardless of the precision and scale specified.

Convertendo dados decimais e numéricosConverting decimal and numeric data

Para os tipos de dados decimal e numeric, SQL ServerSQL Server considera cada combinação de precisão e escala como um tipo de dados diferente.For decimal and numeric data types, SQL ServerSQL Server considers each combination of precision and scale as a different data type. Por exemplo, decimal(5,5) e decimal(5,0) são considerados tipos de dados diferentes.For example, decimal(5,5) and decimal(5,0) are considered different data types.

Nas instruções Transact-SQLTransact-SQL, uma constante com um ponto decimal é convertida automaticamente em um valor de dados numeric, usando a escala e a precisão mínimas necessárias.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. Por exemplo, a constante 12,345 é convertida em um valor numeric com uma precisão 5 e uma escala 3.For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.

Converter de decimal ou numeric para float ou real pode causar perda de precisão.Converting from decimal or numeric to float or real can cause some loss of precision. Converter de int, smallint, tinyint, float, real, money ou smallmoney para decimal ou numeric pode causar estouro.Converting from int, smallint, tinyint, float, real, money, or smallmoney to either decimal or numeric can cause overflow.

Por padrão, o SQL ServerSQL Server usa arredondamento ao converter um número em um valor decimal ou numeric com precisão e escala inferiores.By default, SQL ServerSQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. Por outro lado, se a opção SET ARITHABORT for ON, o SQL ServerSQL Server irá gerar um erro quando acontecer o estouro.Conversely, if the SET ARITHABORT option is ON, SQL ServerSQL Server raises an error when overflow occurs. Apenas a perda de precisão e escala não é suficiente para gerar um erro.Loss of only precision and scale isn't sufficient to raise an error.

Antes do SQL Server 2016 (13.x)SQL Server 2016 (13.x), a conversão de valores float para decimal ou numeric era restrita somente a valores com precisão de 17 dígitos.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. Qualquer valor float menor que 5E-18 (quando definido usando a notação científica de 5E-18 ou a notação decimal de 0,0000000000000000050000000000000005) é arredondado para 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. Essa não é mais uma restrição no SQL Server 2016 (13.x)SQL Server 2016 (13.x) em diante.This is no longer a restriction as of SQL Server 2016 (13.x)SQL Server 2016 (13.x).

ExemplosExamples

O exemplo a seguir cria uma tabela usando os tipos de dados decimal e numérico.The following example creates a table using the decimal and numeric data types. Os valores são inseridos em cada coluna.Values are inserted into each column. Os resultados são retornados usando uma instrução 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;  
  

Este é o conjunto de resultados.Here is the result set.

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

Confira tambémSee also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
CAST e 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)