¿Cómo interpreto la precisión y la escala de un número en una base de datos?

245

Tengo la siguiente columna especificada en una base de datos: decimal (5,2)

¿Cómo se interpreta esto?

De acuerdo con las propiedades de la columna como se ve en el estudio de administración de SQL Server, puedo ver que significa: decimal (precisión numérica, escala numérica).

¿Qué significan la precisión y la escala en términos reales?

Sería fácil interpretar esto como un decimal con 5 dígitos y dos decimales ... es decir, 12345.12

PD: He podido determinar la respuesta correcta de un colega, pero tuve grandes dificultades para encontrar una respuesta en línea. Como tal, me gustaría tener la pregunta y la respuesta documentadas aquí en stackoverflow para referencia futura.

mezoide
fuente

Respuestas:

396

La precisión numérica se refiere al número máximo de dígitos que están presentes en el número.

es decir, 1234567.89 tiene una precisión de 9

La escala numérica se refiere al número máximo de decimales.

es decir, 123456.789 tiene una escala de 3

Por lo tanto, el valor máximo permitido para decimal (5,2) es 999.99

mezoide
fuente
14
No olvide que si está utilizando un sistema que le permite predefinir la precisión y la escala de una entrada para un porcentaje en algo como Microsoft Access, debe considerar el porcentaje como su forma de número entero. En este caso, el 25.5% requeriría precisión 4 y escala de 3 (no uno) ya que tenemos que considerarlo como .255. Me encontré con este problema al principio y me quedé perplejo por un tiempo preguntándome por qué la escala 1 no estaba funcionando.
Ashton Sheets
1
@mezoid ¿Qué significa un valor de escala negativo?
Geek
@Geek Según technet.microsoft.com/en-us/library/ms187746.aspx La escala no puede ser inferior a cero. 0 <= escala <= precisión. Esencialmente, un valor de escala negativo no tendría sentido.
mezoide
1
¿No debería ser: "La precisión numérica se refiere al número máximo de dígitos que podrían estar presentes en el número"? El número exacto 123.5 también podría ser de precisión 10, pero no hay más dígitos para agregar. ¿O esto se convertiría en 123.5000000?
Chris311
86

La precisión de un número es el número de dígitos.

La escala de un número es el número de dígitos después del punto decimal.

Lo que generalmente se implica al establecer la precisión y la escala en la definición de campo es que representan valores máximos .

Ejemplo, un campo decimal definido con precision=5y scale=2permitiría los siguientes valores:

  • 123.45 (p = 5, s = 2)
  • 12.34 (p = 4, s = 2)
  • 12345 (p = 5, s = 0)
  • 123.4 (p = 4, s = 1)
  • 0 (p = 0, s = 0)

Los siguientes valores no están permitidos o causarían una pérdida de datos:

  • 12.345(p = 5, s = 3) => podría truncarse en 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => podría truncarse en 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => podría truncarse en 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => fuera de rango

Tenga en cuenta que el rango generalmente se define por la precisión: |value| < 10^p...

boumbh
fuente
55
Tenga en cuenta que MS SQL Server no permitiría 12345 o 1234.56 porque "[escala] se resta de [precisión] para determinar el número máximo de dígitos a la izquierda del punto decimal". (fuente: decimal y numérico )
molnarm
¿Qué tal 12345000? Precisión 5 u 8? Si es 5, ¿con qué escala? Escala -3?
Towi
@towi, ¿qué significa eso? Si quisieras almacenar eso, usarías 8,0.
Rob Grant
Buena respuesta, pero ¿por qué está 123450 (p=6,s=0)fuera de rango? 123450 tiene 6 dígitos y ningún dígito después de un punto?
Matthias Burger
1
@MatthiasBurger 123450 (p=6,s=0)estaría fuera del rango para un campo decimal con 5 precisión (como se menciona en el ejemplo). Debido a que la precisión de un número que desea almacenar en un campo debe ser menor o igual que la precisión del campo.
Snozzlebert
26

Precisión, escala y longitud en las lecturas de documentación de SQL Server 2000:

La precisión es el número de dígitos en un número. La escala es el número de dígitos a la derecha del punto decimal en un número. Por ejemplo, el número 123.45 tiene una precisión de 5 y una escala de 2.

Chris
fuente
Gracias. Me acabo de dar cuenta de que una parte del código Delphi / Pascal estaba usando una escala de 0 para cortar la parte decimal del flotador
peterchaula