Артефакты округления числовой точности в PostgreSQL

У нас есть приложение, которое пытается выполнить массовую вставку в таблицу в postgresql (думаю, 9.1, у меня нет доступа, чтобы помочь коллеге удаленно устранять неполадки). Трассировка показывает, что необработанные значения генерируются правильно и правильно передаются в ODBC.

Проблема возникает, когда столбец определен как NUMERIC, но не имеет заданного масштаба или точности. Кажется, есть «случайные» артефакты округления. Иногда округляет в большую сторону, иногда в меньшую, независимо от количества знаков после запятой. Это видно, когда затем запрашиваются значения из массовой вставки.

Я знаю, что это может вызвать проблемы со строками, но не уверен, что это имеет значение для числовых типов данных. База данных закодирована в Windows 1252, и они используют драйвер Unicode postgresql. Наконец, немного информации о 32-битной виртуальной машине Windows с параметрами config_file по умолчанию.

Вопрос в том, что могло/могло быть причиной этого?

Заранее спасибо.


person cjweitz    schedule 25.03.2015    source источник


Ответы (1)


Тип данных numeric представляет собой тип данных произвольной точности< /a>, а не тип с плавающей запятой, такой как float8 (double precision) или float4 (real). То есть он хранит переданные ему десятичные цифры без какого-либо округления. Номера воспроизводятся одинаково. Только точный формат может зависеть от вашей локали или настроек промежуточного программного обеспечения и клиента.

Тот факт, что точность и масштаб не были установлены, позволяет столбцу numeric делать это почти 1 без ограничений.

1 Согласно документации:

до 131072 знаков до запятой; до 16383 знаков после запятой.

Суть этого: вы можете исключить тип данных Postgres numeric в качестве источника для эффекта округления. Я не знаю об остальном, тем более, что вы не предоставили точные номера версий, демонстрационные значения или воспроизводимый тестовый пример.
Мой шанс в темноте будет заключаться в том, что ODBC может обрабатывать число как тип с плавающей запятой. Может устаревшая версия?

person Erwin Brandstetter    schedule 25.03.2015