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.battuello@xxxxxxxxxxx> 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=# \xExpanded display is on.postgres=# select round(cast(1230.5 as double precision)) as round_double_even_0postgres-# ,round(cast(1231.5 as double precision)) as round_double_odd_1postgres-# ,round(cast(1232.5 as double precision)) as round_double_even_2postgres-# ,round(cast(1233.5 as double precision)) as round_double_odd_3postgres-# ,round(cast(1234.5 as double precision)) as round_double_even_4postgres-# ,round(cast(1235.5 as double precision)) as round_double_odd_5postgres-# ;-[ RECORD 1 ]-------+-----round_double_even_0 | 1230round_double_odd_1 | 1232round_double_even_2 | 1232round_double_odd_3 | 1234round_double_even_4 | 1234round_double_odd_5 | 1236postgres=# select round(cast(1230.5 as numeric)) as round_numeric_even_0postgres-# ,round(cast(1231.5 as numeric)) as round_numeric_odd_1postgres-# ,round(cast(1232.5 as numeric)) as round_numeric_even_2postgres-# ,round(cast(1233.5 as numeric)) as round_numeric_odd_3postgres-# ,round(cast(1234.5 as numeric)) as round_numeric_even_4postgres-# ,round(cast(1235.5 as numeric)) as round_numeric_odd_5postgres-# ;-[ RECORD 1 ]--------+-----round_numeric_even_0 | 1231round_numeric_odd_1 | 1232round_numeric_even_2 | 1233round_numeric_odd_3 | 1234round_numeric_even_4 | 1235round_numeric_odd_5 | 1236postgres=# 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 | 1231round_odd_1 | 1232round_even_2 | 1233round_odd_3 | 1234round_even_4 | 1235round_odd_5 | 1236postgres=# \qWhy does the algorithm vary by data type?Or is something entirely different happening?