Real в Postgres — это тип данных с плавающей запятой, хранящийся в 4 байтах, который составляет 32 бита.
Ваша ценность,
0.00000000000000000000000000000000000000000009
Не может быть точно представлено в 32-битном числе с плавающей запятой IEEE754. Вы можете проверить точные значения в этом калькуляторе.
Вы можете попытаться использовать двойную точность (64 бита) для хранения, согласно калькулятору, это кажется точным представлением. НЕ ВЕРНО Патрисия показала, что это был просто калькулятор, который округлял значение, хотя явно просил этого не делать... Двойное значение означало бы немного большую точность, но все же не точное значение, поскольку это число не может быть представлено с использованием конечного числа двоичных цифр. (Спасибо, Патрисия, урок усвоен (снова): не верьте тому, что вы видите на Intertubez)
В обычных обстоятельствах вы должны использовать формат NUMERIC (точность, масштаб), который будет точно хранить число, чтобы получить правильное значение.
Однако ваше значение для хранения, по-видимому, имеет масштаб больше, чем позволяет postgres (который, кажется, равен 30) для точных десятичных представлений. Если вы не хотите выполнять вычисления, просто сохраните их (признаю, что это не очень распространенная ситуация), вы можете попробовать сохранить их в виде строк... (но это некрасиво...)
ИЗМЕНИТЬ
Эта проблема с to_char кажется известной ошибкойсильный>...
Цитировать:
Моя немедленная реакция на это заключается в том, что значения float8 не имеют 57-значной точности. Если вы ожидаете, что эта строка формата сделает что-то полезное, вы должны применить ее к числовому столбцу, а не к столбцу с двойной точностью.
Вполне возможно, что мы можем что-то изменить, чтобы этот конкретный случай работал так, как вы ожидаете, но всегда будут похожие случаи, которые не могут работать, потому что точности просто нет.
При беглом взгляде на код причина, по которой вы просто получаете «0». заключается в том, что он округляется после 15 цифр, чтобы гарантировать, что он не печатает мусор. Может быть, это было бы немного разумнее для случаев, когда значение намного меньше 1, но это не будет простым изменением.
(отсюда)
Тем не менее, я считаю, что это не оправдано. ИМХО, двойное число (точнее, 64-битная плавающая точка IEEE754) всегда будет иметь ~15 значащих десятичных цифр, если значение соответствует типу...
Рекомендуемое чтение:
person
ppeterka
schedule
18.09.2013
real
(postgresql.org/docs/9.1/static/ числовой тип данных.html) - person palacsint   schedule 18.09.2013