From: | Torsten Förtsch <tfoertsch123(at)gmail(dot)com> |
---|---|
To: | Louis Battuello <louis(dot)battuello(at)etasseo(dot)com> |
Cc: | PostgreSQL mailing lists <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Rounding Double Precision or Numeric |
Date: | 2017-06-01 16:41:31 |
Message-ID: | CAKkG4_nqdZGvcrhNxSszRpCewETX56dE4T8hVF8f2pE=qLPzYA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
This is documented in section 8.1.2 in the manual. (
https://www.postgresql.org/docs/9.6/static/datatype-numeric.html)
NUMERIC rounds away from zero.
IEEE 754 based data types (FLOAT, DOUBLE PRECISION) round to the closest
even number.
On Thu, Jun 1, 2017 at 6:26 PM, Louis Battuello <louis(dot)battuello(at)etasseo(dot)com
> wrote:
> Is the round() function implemented differently for double precision than
> for numeric? Forgive me if this exists somewhere in the documentation, but
> I can't seem to find it.
>
> I've noticed with 9.6 on OSX, the .5 rounding is handled differently
> between the types. (I haven't tested other versions, yet.) For double
> precision values, even whole numbers are rounded down, yet for odds they
> are rounded up. For numeric values, all .5 numbers are rounded up.
>
> psql (9.6.3)
> Type "help" for help.
>
> postgres=# \x
> Expanded display is on.
> postgres=# select round(cast(1230.5 as double precision)) as
> round_double_even_0
> postgres-# ,round(cast(1231.5 as double precision)) as
> round_double_odd_1
> postgres-# ,round(cast(1232.5 as double precision)) as
> round_double_even_2
> postgres-# ,round(cast(1233.5 as double precision)) as
> round_double_odd_3
> postgres-# ,round(cast(1234.5 as double precision)) as
> round_double_even_4
> postgres-# ,round(cast(1235.5 as double precision)) as
> round_double_odd_5
> postgres-# ;
>
> -[ RECORD 1 ]-------+-----
> round_double_even_0 | 1230
> round_double_odd_1 | 1232
> round_double_even_2 | 1232
> round_double_odd_3 | 1234
> round_double_even_4 | 1234
> round_double_odd_5 | 1236
>
> postgres=# select round(cast(1230.5 as numeric)) as round_numeric_even_0
> postgres-# ,round(cast(1231.5 as numeric)) as round_numeric_odd_1
> postgres-# ,round(cast(1232.5 as numeric)) as round_numeric_even_2
> postgres-# ,round(cast(1233.5 as numeric)) as round_numeric_odd_3
> postgres-# ,round(cast(1234.5 as numeric)) as round_numeric_even_4
> postgres-# ,round(cast(1235.5 as numeric)) as round_numeric_odd_5
> postgres-# ;
>
> -[ RECORD 1 ]--------+-----
> round_numeric_even_0 | 1231
> round_numeric_odd_1 | 1232
> round_numeric_even_2 | 1233
> round_numeric_odd_3 | 1234
> round_numeric_even_4 | 1235
> round_numeric_odd_5 | 1236
>
> postgres=# select round(1230.5) as round_even_0
> ,round(1231.5) as round_odd_1
> ,round(1232.5) as round_even_2
> ,round(1233.5) as round_odd_3
> ,round(1234.5) as round_even_4
> ,round(1235.5) as round_odd_5
> ;
>
> -[ RECORD 1 ]+-----
> round_even_0 | 1231
> round_odd_1 | 1232
> round_even_2 | 1233
> round_odd_3 | 1234
> round_even_4 | 1235
> round_odd_5 | 1236
>
> postgres=# \q
>
> Why does the algorithm vary by data type?
>
> Or is something entirely different happening?
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2017-06-01 16:41:42 | Re: Slow query plan used |
Previous Message | Louis Battuello | 2017-06-01 16:26:19 | Rounding Double Precision or Numeric |