[GENERAL] Rounding Double Precision or Numeric

Поиск
Список
Период
Сортировка
От Louis Battuello
Тема [GENERAL] Rounding Double Precision or Numeric
Дата
Msg-id 31A12901-20F2-4463-B745-E776CD927444@etasseo.com
обсуждение исходный текст
Ответы Re: [GENERAL] Rounding Double Precision or Numeric
Re: [GENERAL] Rounding Double Precision or Numeric
Список pgsql-general
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?

В списке pgsql-general по дате отправления:

Предыдущее
От: Bill Moran
Дата:
Сообщение: Re: [GENERAL] Slow query plan used
Следующее
От: Torsten Förtsch
Дата:
Сообщение: Re: [GENERAL] Rounding Double Precision or Numeric