Re: Pregunta NUMERIC vs REAL-FLOAT

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Paolo Lopez <murphyperu(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Pregunta NUMERIC vs REAL-FLOAT
Date: 2005-08-25 18:30:15
Message-ID: 20050825183015.GC23250@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, Aug 25, 2005 at 11:57:14AM -0500, Paolo Lopez wrote:
> Hola a todos.
>
> He revisado en el link que me mandas, y si es verdad todo esta ahi,
> pero son bastantes mails q leer. Alguna ayudita de en q mes podria
> encontrar esa informacion ??

Hola, puedes usar un motor de busqueda para buscar preguntas similares a
la tuya, como por ejemplo este:

http://www.pgsql.ru/

> Si pudieran darme mas luces con lo del NUMERIC en vez de REAL-FLOAT
> seria de gran ayuda, estoy ya casi terminando con las pantallas de
> pagos.

El tema es que las operaciones con numeros de punto flotante pierden
precision, cosa que es completamente inaceptable para manejar dinero.
Para esto se usan los numeros de precision arbitraria, como NUMERIC. Es
cierto que es un poco mas lento, pero si quieres que tus datos sean
coherentes, es un precio que hay que pagar.

Si no quieres limitarte a una determinada precision y escala, puedes
especificar un tipo de columna como NUMERIC sin esos argumentos. En tal
caso, el sistema no limitara la precision y escala de los datos que
almacenes en esa columna.

El ejemplo de abajo es bastante artificial por lo sencillo, pero ilustra
el punto (en situaciones reales puede molestarte la perdida de precision
con bastante mas facilidad, sobre todo si te toca multiplicar o dividir):

alvherre=# create table a (a numeric);
CREATE TABLE
alvherre=# insert into a values (0.000000001);
INSERT 0 1
alvherre=# insert into a values (100000000);
INSERT 0 1
alvherre=# select * from a;
a
-------------
0.000000001
100000000
(2 filas)

alvherre=# select sum(a) from a;
sum
---------------------
100000000.000000001
(1 fila)

alvherre=# create table b (a float);
CREATE TABLE
alvherre=# insert into b values (0.000000001);
INSERT 0 1
alvherre=# insert into b values (100000000);
INSERT 0 1
alvherre=# select * from b;
a
-----------
1e-09
100000000
(2 filas)

alvherre=# select sum(a) from b;
sum
-----------
100000000
(1 fila)

--
Alvaro Herrera (<alvherre[a]alvh.no-ip.org>)
"Always assume the user will do much worse than the stupidest thing
you can imagine." (Julien PUYDT)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message guillermo saez 2005-08-25 22:22:58 Intalacion de postgre en win98
Previous Message Marcos Matamala 2005-08-25 17:55:37 Re: Pregunta NUMERIC vs REAL-FLOAT