Cuando defines que los datos que se guardarán en una columna serán de tipo numérico debes decidir también cual de los tipos numéricos que posee el Firebird emplearás. Estas son tus opciones:

  • SMALLINT
  • INTEGER
  • BIGINT
  • NUMERIC
  • DECIMAL
  • FLOAT
  • DOUBLE PRECISION

Como ves, tienes 7 posibilidades, cada una de ellas será la más apropiada para alguna circunstancia, así que ahora debes decidirte por una de esas 7 alternativas.

¿Necesitas guardar números exactos o números aproximados?

A veces, el número que guardas en un columna debe ser exacto, no se admite por ningún motivo que sea aproximado. Ese es el caso del dinero. Allí, tendrás que saber hasta el último centavo cuanto dinero te debe un cliente. O cuanto dinero le cobraste a ese cliente. No puedes responder con algo como: “aproximadamente 100 dólares”, sino que debes responder con el monto exacto.

Otras veces, un número aproximado es apropiado, por ejemplo: ¿cuánto pesó la última bolsa de harina que se puso en la balanza? si respondes con: 52 kilogramos y 245 gramos estará ok, si no eran 245 gramos sino 246 gramos ó 247 gramos no hay problema. Lo mismo que si en lugar de ser 245 gramos eran en realidad 245,1304 gramos. No hay problema.

Necesitarás guardar valores exactos cuando estés tratando con cantidades (dinero, unidades, cajas, precios, etc.) o sea algo que se puede contar y podrás usar valores aproximados cuando puedas medirlo (longitud, volumen, peso, presión, voltaje, etc.)

¿Puedes contarlo? entonces necesitarás números exactos

¿Puedes medirlo? entonces podrás usar números aproximados

¿Cuáles son los tipos de datos numéricos exactos?

  • SMALLINT
  • INTEGER
  • BIGINT
  • NUMERIC
  • DECIMAL

Estos tipos de datos pueden guardar números enteros y también números con decimales. La precisión (representada con la letra “p”) es la cantidad de dígitos significativos. La escala (representada con la letra “s”) es la cantidad de dígitos que se encuentran a la derecha de la coma decimal.

Por ejemplo: DECIMAL(8, 3) significa ppppp.sss

Aquí, hay 8 dígitos en total y como 3 de ellos corresponden a la parte decimal eso implica que hay 5 en la parte entera.

¿Cuáles son los tipos de datos numéricos aproximados?

  • FLOAT
  • DOUBLE PRECISION

Estos tipos de datos guardan números decimales y números con exponentes.

Los últimos decimales de estos números pueden variar cuando se hacen operaciones matemáticas, por eso nunca se los debe usar para guardar en ellos cantidades que deben ser exactas.

Rangos de valores

TIPO DE DATOS       DESDE              HASTA                 .
SMALLINT            -32768             32767 
INTEGER             -2147483648        2147483647 
BIGINT              -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
NUMERIC             -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
DECIMAL             -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
FLOAT               1,175 * 10 ^ -38   3,402 * 10 ^ 38 
DOUBLE PRECISION    2,225 * 10 ^ -308  1,797 * 10 ^ 308

Ejemplo que muestra el error de precisión cuando se usa FLOAT

Este ejemplo nos mostrará por qué no debemos guardar valores que deben ser exactos en una columna de tipo FLOAT

UPDATE
   PRODUCTOS
SET
   PRD_PREVTA = 1.23456
WHERE
   PRD_IDENTI = 215

Este comando UPDATE guarda el número 1.23456 en la columna PRD_PREVTA (precio de venta) de la tabla PRODUCTOS para el producto cuyo identificador es 215.

Ahora, queremos ver el precio de venta que guardamos con el comando UPDATE. Deberíamos ver 1.23456 ¿será eso lo que veremos?

SELECT
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_IDENTI = 215

La imagen de abajo es lo que obtenemos al ejecutar este SELECT.

PREVTA

(haciendo click en la imagen la verás más grande)

Pues no, no obtuvimos 1.23456 sino un número un poco mayor, un número diferente.

Mucho cuidado con esto, cuando se trata de dinero esta clase de errores son totalmente inaceptables.

Artículo relacionado:

https://firebird21.wordpress.com/2013/03/04/entendiendo-numeric-y-decimal/