Como seguramente sabes, las columnas de tipo NUMERIC se usan para guardar números que tienen coma fija. Eso significa que la cantidad de decimales es siempre la misma.

Un número de coma flotante puede tener una cantidad infinita de decimales, en cambio un número de coma fija siempre tiene una cantidad fija de decimales. Por ejemplo, el resultado de dividir 1 entre 3 es:

1 / 3 = 0,3333333333333333333333333333333333333333333333…..

Pero en los números de coma fija se determina cuantos decimales tendrán. Por ejemplo, si se desea que tengan dos decimales:

1 / 3 = 0,33

Evidentemente el resultado no es exacto. Y lo podemos ver haciendo la operación inversa:

3 * 0,33 = 0,99

Si el resultado fuera exacto hubiéramos obtenido 1, pero no obtuvimos 1 sino que obtuvimos 0,99. Está muy cerca pero no es exacto.

Es por ese motivo que siempre que trabajamos con columnas de tipo NUMERIC debemos guardar en nuestras tablas al menos un decimal más de los que les mostraremos a los usuarios.

Así, si por ejemplo queremos que en las pantallas y en los informes los precios se vean con dos decimales estaría mal que los definiéramos como:

NUMERIC (8, 2)

porque perderíamos precisión si alguna vez hacemos una división. Lo correcto sería guardarlos como:

NUMERIC (10, 3)

ya que eso nos aseguraría de no perder precisión.

Las columnas de tipo NUMERIC se especifican como p, s

Siendo p la precisión y s la escala.

NUMERIC(10, 4) significa que la precisión es 10 y que la escala es 4.

¿Y hasta qué valores numéricos podemos guardar en columnas de tipo NUMERIC?

Para verificarlo creamos una tabla llamada NUMEROS con esta estructura:

NUMEROS1

Captura 1. Si haces clic en la imagen la verás más grande

Y luego le insertamos datos a cada columna, obteniendo estos resultados:

NUMEROS2

  Captura 2. Si haces clic en la imagen la verás más grande

¿Qué podemos deducir viendo la Captura 2?

Que la escala es siempre la que hemos definido pero la precisión no.

Por ejemplo, NUMERIC(5, 3) tiene tres decimales, NUMERIC(6, 5) tiene cinco decimales. La cantidad de decimales (o sea, la escala) siempre coincide con lo que hemos definido pero la precisión (es decir, la parte entera) no.

NUMERIC(6, 6) tiene seis decimales. Coincide. Pero solamente tiene tres dígitos en la parte entera. No coincide.

¿Qué implica todo esto?

Que es un error creer que la precisión siempre coincidirá con la cantidad de dígitos de la parte entera. Por regla general NO COINCIDIRÁ y cuanto mayor sea la escala (o sea, la cantidad de decimales) menor será el número que se puede encontrar en la parte entera.

Conclusión:

El tipo de datos NUMERIC se utiliza para guardar números de coma fija. O sea números que siempre tendrán la misma cantidad de decimales.

El formato de estos números es NUMERIC (p, s)

siendo p la precisión y s la escala.

La escala s es siempre la definida y por lo tanto siempre sabremos cuantos decimales tendrán los números guardados en esa columna. Pero eso no ocurre con la precisión p ya que ésta va disminuyendo a medida que la escala s va aumentando.

No existe una regla mnemónica para saber cual debe ser la precisión para una caso dado. Por ejemplo, si queremos guardar números que podrán tener hasta 10 dígitos en la parte entera y 6 dígitos en la parte decimal ¿cómo declaramos a esa columna?

Pues mediante “prueba y error”.

Creamos una columna que tenga una precisión p de al menos 10 y una escala s de 6. Luego vamos aumentando la precisión p hasta encontrar el valor buscado.

Artículos relacionados:

Entendiendo NUMERIC y DECIMAL

Usando NUMERIC y DECIMAL

El índice del blog Firebird21

Anuncios