Почему при выборе реального типа печатается только до 6 цифр в Postgres? - PullRequest
1 голос
/ 10 марта 2020

У меня есть таблица Postgres, в которой есть столбец типа real.

Когда я использую запрос для выбора значений из этого столбца (например, select amount from my_table), он округляется значение для чисел больше 100 000. (Он полностью игнорирует десятичную часть). Для чисел, превышающих 1 000 000, он отображает их в формате scientifi c. Для чисел, меньших 100 000, он удаляет десятичную часть, так что в целом выводятся только 6 цифр (например, 1000.12345 становится 1000.12).

Это только когда я приводю значение к двойной точности (используя CAST(amount as double precision) ) что он начинает вести себя так, как я ожидал, и распечатывает все сохраненные десятичные цифры.

У кого-нибудь есть идея, почему Postgres ведет себя таким образом?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

ОК, но в PG 12.2 есть некоторые различия в форматировании между реальной и двойной точностью:

# select x, x::double precision from t order by 1;
       x       |      x      
---------------+-------------
        123456 |      123456
        999999 |      999999
         1e+06 |     1000000
  1.000001e+06 |     1000001
  1.234567e+06 |     1234567
 1.2345671e+06 | 1234567.125
  1.234568e+06 |     1234568
  9.999999e+06 |     9999999
  9.999999e+06 |     9999999
         1e+08 |   100000000
 1.2345679e+09 |  1234567936
 1.2345679e+09 |  1234567936
(12 rows)

И кажется, что вы можете иметь точность до 7 десятичных знаков.

0 голосов
/ 10 марта 2020

Ответ вероятен в PostgreSQL исходный код postgres / src / fe_utils / print. c. Комментарии для format_numeric_locale говорят:

/*
 * Format a numeric value per current LC_NUMERIC locale setting
 *
 * Returns the appropriately formatted string in a new allocated block,
 * caller must free.
 *
 * setDecimalLocale() must have been called earlier.
 */

См. Также комментарии в setDecimalLocale.

Также возможно, что некоторые причины можно найти в стандартах SQL.

...