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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Tipos de datos numéricos que tienen precisión y escala fijas.Numeric data types that have fixed precision and scale. Los tipos decimal y numeric son sinónimos y se pueden usar indistintamente.Decimal and numeric are synonyms and can be used interchangeably.

ArgumentosArguments

decimal[ (p[ ,s] )] y numeric[ (p[ ,s] )]decimal[ (p[ ,s] )] and numeric[ (p[ ,s] )]
Números de precisión y escala fijas.Fixed precision and scale numbers. Cuando se utiliza la precisión máxima, los valores válidos se sitúan entre - 10^38 +1 y 10^38 - 1.When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1. Los sinónimos ISO para decimal son dec y dec(p, s).The ISO synonyms for decimal are dec and dec(p, s). numeric equivale desde el punto de vista funcional a decimal.numeric is functionally equivalent to decimal.

p (precisión)p (precision)
El número total máximo de dígitos decimales que almacenará, tanto a la izquierda como a la derecha del separador decimal.The maximum total number of decimal digits that will be stored, both to the left and to the right of the decimal point. La precisión debe ser un valor comprendido entre 1 y la precisión máxima de 38.The precision must be a value from 1 through the maximum precision of 38. La precisión predeterminada es 18.The default precision is 18.

Nota

Informatica solo admite 16 dígitos significativos, sin tener en cuenta la precisión y la escala especificada.Informatica only supports 16 significant digits, regardless of the precision and scale specified.

s (escala)s (scale)
El número de dígitos decimales que se almacenará a la derecha del separador decimal.The number of decimal digits that will be stored to the right of the decimal point. Este número se extrae de p para determinar el número máximo de dígitos a la izquierda del separador decimal.This number is subtracted from p to determine the maximum number of digits to the left of the decimal point. La escala debe ser un valor comprendido entre 0 y p.Scale must be a value from 0 through p. Solo es posible especificar la escala si se ha especificado la precisión.Scale can be specified only if precision is specified. La escala predeterminada es 0; por tanto, 0 <= s <= p.The default scale is 0; therefore, 0 <= s <= p. Los tamaños de almacenamiento máximo varían según la precisión.Maximum storage sizes vary, based on the precision.

PrecisiónPrecision Bytes de almacenamientoStorage bytes
1 - 91 - 9 55
10-1910-19 99
20-2820-28 1313
29-3829-38 1717

Nota

Informatica (conectado a través del conector PDW de SQL Server de Informatica) solo admite 16 dígitos significativos, sin tener en cuenta la precisión y la escala especificada.Informatica (connected through the SQL Server PDW Informatica Connector) only supports 16 significant digits, regardless of the precision and scale specified.

Convertir datos decimal y numericConverting decimal and numeric data

En el caso de los tipos de datos decimal y numeric, SQL ServerSQL Server considera cada combinación específica de precisión y escala como un tipo de datos distinto.For the decimal and numeric data types, SQL ServerSQL Server considers each specific combination of precision and scale as a different data type. Por ejemplo, decimal(5,5) y decimal(5,0) se consideran tipos de datos diferentes.For example, decimal(5,5) and decimal(5,0) are considered different data types.

En las instrucciones Transact-SQLTransact-SQL, una constante con un separador decimal se convierte automáticamente a un valor de datos numeric, con la precisión y escala mínimas necesarias.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 ejemplo, la constante 12.345 se convierte a un valor numeric con una precisión de 5 y una escala de 3.For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.

Al convertir de decimal o numeric a float o real se puede provocar una pérdida de precisión.Converting from decimal or numeric to float or real can cause some loss of precision. Al convertir de int, smallint, tinyint, float, real, money o smallmoney a decimal o numeric se puede provocar un desbordamiento.Converting from int, smallint, tinyint, float, real, money, or smallmoney to either decimal or numeric can cause overflow.

De forma predeterminada, SQL ServerSQL Server usa el redondeo cuando convierte un número a un valor decimal o numeric con una precisión y una 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. Sin embargo, si la opción SET ARITHABORT está establecida en ON, SQL ServerSQL Server genera un error cuando se produce un desbordamiento.However, if the SET ARITHABORT option is ON, SQL ServerSQL Server raises an error when overflow occurs. La pérdida de precisión y escala no es suficiente para generar un error.Loss of only precision and scale is not sufficient to raise an error.

Cuando se conviertan valores float o reales a valores decimales o numéricos, el valor decimal nunca tendrá más de 17 decimales.When converting float or real values to decimal or numeric, the decimal value will never have more than 17 decimals. Los valores float < 5E-18 se convertirán siempre en 0.Any float value < 5E-18 will always convert as 0.

EjemplosExamples

En este ejemplo se crea una tabla con los tipos de datos decimal y numeric.The following example creates a table using the decimal and numeric data types. Se insertan valores en cada columna y los resultados se devuelven con una instrucción SELECT.Values are inserted into each column and 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;  

El conjunto de resultados es el siguiente.Here is the result set.

MyDecimalColumn                         MyNumericColumn  
--------------------------------------- ---------------------------------------  
123.00                                  12345.12000  

(1 row(s) affected)  

Vea tambiénSee also

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