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:
> 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)
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 |