powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тип numeric и работа с ним
6 сообщений из 6, страница 1 из 1
тип numeric и работа с ним
    #39280243
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые специалисты. Прошу совета.

Суть проблемы:
Есть таблицы, с полями Numeric.

Запись в таблицы происходит таким образом:
Допустим пришло число 1.123Е-20 соответственно в таблице отражается число 0.0000000000000000001123.

Читается из таблицы точно такое же число 0.0000000000000000001123.

Вопрос. Возможно ли отображать в таблицах с полями Numeric числа в формате 1.123Е-20?
Если нет, то возможно ли правильно преобразовать число к первоначальному виду из 0.0000000000000000001123 в 1.123Е-20 для чтения?

Суть в том, что если просто проделать ::float то он оставит до 15 знаков, мне же нужно хотя бы 17 знаков оставить, тоесть при работе с числами вида 0.000000000000000000000000000000001495679999999995675679999
я получаю
select '0.000000000000000000000000000000001495679999999995675679999'::float;
1.49568e-33
что меня не устраивает, поскольку значащих цифр крайне мало, хотелось бы что то типа 1.49567999999999567567e-33, такое возможно?

Заранее извиняюсь, если чушь какую то спрашиваю, сильно не пинайте, только начинаю разбираться в этом всем.
...
Рейтинг: 0 / 0
тип numeric и работа с ним
    #39280287
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforse,

offtop
там есть забавная философско--математическая бага:

Код: sql
1.
2.
3.
4.
SELECT ('0.0'||repeat('0',400)||'1')::numeric::float;
----------
ERROR: "0.000...00001" is out of range for type double precision
SQL-состояние: 22003



-- для физика это именно бага, а для кодера -- фича и якобы так и д.б..
/offtop
...
Рейтинг: 0 / 0
тип numeric и работа с ним
    #39280531
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforse... в таблице отражается число ...
В таблице число хранится. А отобразить при выборке его можно по-разному.

9.8. Data Type Formatting Functions

Код: sql
1.
select to_char('1.123e-20'::numeric, '9.99999999999999999999EEEE');
...
Рейтинг: 0 / 0
тип numeric и работа с ним
    #39281731
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

к сожалению to_char не совсем то что нужно.

Попробую обрисовать проблему под другим углом.

Для использования точных вычислений мы переработали базу с float на numeric, поскольку float даёт обрезку и округление до 15 знаков. Но поскольку клиент работает через ODBC драйвер, возникла ситуация что драйвер считывает числа так как они видны в таблице:
-0.000000000000004713167022163789226645

А поскольку в драйвере задан жесткий буфер в 36 знаков, все остальное он откидывает. И выводит такое сообщение в лог файл

авторThe 3th item was truncated
The buffer size = 36 and the value is '-0.0000000000000047131670221637892266'


Я не могу понять, почему драйвер считывает все знаки, а не сворачивает в степень. Вот из-за этого вопрос, может есть конфигурационные параметры отвечающие за это?

Как тока я делаю ::float он замечательно сворачивает, и считывает. Но от float нам сказали уйти, вот и бьёмся.
...
Рейтинг: 0 / 0
тип numeric и работа с ним
    #39281784
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforseЯ не могу понять, почему драйвер считывает все знаки, а не сворачивает в степень.
А драйвер и не должен этого делать, он передаёт вам данные.

Встречный вопрос — какие типы данных вы используете в вашем приложении, чтобы работать с числами такой точности?
Может имеет смысл всё же в строку преобразовывать для передачи данных, а потом уже приводить к нужному типу внутри приложения?
...
Рейтинг: 0 / 0
тип numeric и работа с ним
    #39282530
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforseв драйвере задан жесткий буфер в 36 знаков
Получается, это ошибка драйвера. Кто ему дал право обрезать значения numeric?

Может быть получится использовать to_char(), подумайте об обходном пути.
Создать вьюшку с дополнительным полем текстового типа со значениями to_char().
Текстовые значения ведь драйвер не обрезает.

Использовать прямо в таблице текстовое поле вместо numeric для хранения
этих значения можно, но нельзя, потому что некрасиво очень. :)

inforseЯ не могу понять, почему драйвер считывает все знаки, а не сворачивает в степень.
Это было бы решением вашей проблемы, но не решением в общем случае.
А если у кого-то значения numeric с экспонентой и сотней значащих цифр.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / тип numeric и работа с ним
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]