Обсуждение: BUG #5484: sum() bug

Поиск
Список
Период
Сортировка

BUG #5484: sum() bug

От
"Sergey"
Дата:
The following bug has been logged online:

Bug reference:      5484
Logged by:          Sergey
Email address:      viras@yandex.ru
PostgreSQL version: 8.4.4
Operating system:   FreeBSD 7.3
Description:        sum() bug
Details:

Function sum() bug.
8849.15+6464.57=15313.72
But sum()=15313.7

[root@proxy ~]# psql -U pgsql megafon
psql (8.4.4)
Type "help" for help.

megafon=# SELECT version();
                                                 version

----------------------------------------------------------------------------
-----------------------------
 PostgreSQL 8.4.4 on i386-portbld-freebsd7.3, compiled by GCC cc (GCC) 4.2.1
20070719  [FreeBSD], 32-bit
(1 row)

megafon=#
megafon=# SELECT * from aaa;
   num
---------
 8849.15
 6464.57
(2 rows)

megafon=# SELECT sum(num) from aaa;
   sum
---------
 15313.7
(1 row)

megafon=#

Re: BUG #5484: sum() bug

От
Tom Lane
Дата:
"Sergey" <viras@yandex.ru> writes:
> 8849.15+6464.57=15313.72
> But sum()=15313.7

You did not show what datatype you're summing, but if the column is
float4 this result wouldn't be surprising.  float4 is only good
to about six decimal digits.

            regards, tom lane

Re: BUG #5484: sum() bug

От
viras
Дата:
megafon=# \d aaa
Table "public.aaa"
Column | Type | Modifiers
--------+------+-----------
num | real |

Yes, really, on smaller quantity of digits of errors is not present.
What type of the data is better for using? Numbers up to 100000 and accuracy of 2 fractional signs.

30.05.10, 21:43, "Tom Lane" <tgl@sss.pgh.pa.us>:

> "Sergey" <viras@yandex.ru> writes:8849.15+6464.57=15313.72But sum()=15313.7You did not show what datatype you're
summing,but if the column isfloat4 this result wouldn't be surprising.  float4 is only goodto about six decimal digits.
          regards, tom lane 

Re: BUG #5484: sum() bug

От
Robert Haas
Дата:
On Tue, Jun 1, 2010 at 9:24 AM, viras <viras@yandex.ru> wrote:
> megafon=# \d aaa
> Table "public.aaa"
> Column | Type | Modifiers
> --------+------+-----------
> num | real |
>
> Yes, really, on smaller quantity of digits of errors is not present.
> What type of the data is better for using? Numbers up to 100000 and accuracy of 2 fractional signs.

numeric is a good choice to avoid loss of precision, but can be a bit slower.

You could also try float8.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

Re: BUG #5484: sum() bug

От
"Kevin Grittner"
Дата:
Robert Haas <robertmhaas@gmail.com> wrote:
> On Tue, Jun 1, 2010 at 9:24 AM, viras <viras@yandex.ru> wrote:

>> What type of the data is better for using? Numbers up to 100000
>> and accuracy of 2 fractional signs.
>
> numeric is a good choice to avoid loss of precision, but can be a
> bit slower.
>
> You could also try float8.

Yeah, as long as you remember that this is an *approximate* data
type.  If you really mean that you're satisfied with an *accuracy*
of two fractional digits for a number up to 100000, you are OK.  But
realize that means that 1.01 would actually be
1.0100000000000000088817841970012523233890533447265625 and that
100000.01 would actually be
100000.009999999994761310517787933349609375 -- accurate to far more
than two decimal digits, but not *exact*.

If you want exact values based on decimal fractions, you should use
numeric.

-Kevin

Re: BUG #5484: sum() bug

От
viras
Дата:
Many thanks for the help!
numeric is my choice :)

01.06.10, 19:19, "Kevin Grittner" <Kevin.Grittner@wicourts.gov>:

> Robert Haas  wrote:
>  > On Tue, Jun 1, 2010 at 9:24 AM, viras  wrote:
>
>  >> What type of the data is better for using? Numbers up to 100000
>  >> and accuracy of 2 fractional signs.
>  >
>  > numeric is a good choice to avoid loss of precision, but can be a
>  > bit slower.
>  >
>  > You could also try float8.
>
>  Yeah, as long as you remember that this is an *approximate* data
>  type.  If you really mean that you're satisfied with an *accuracy*
>  of two fractional digits for a number up to 100000, you are OK.  But
>  realize that means that 1.01 would actually be
>  1.0100000000000000088817841970012523233890533447265625 and that
>  100000.01 would actually be
>  100000.009999999994761310517787933349609375 -- accurate to far more
>  than two decimal digits, but not *exact*.
>
>  If you want exact values based on decimal fractions, you should use
>  numeric.
>
>  -Kevin
>
>