/ / Запис 0,001 до Postgres 9.x через адаптер даних призводить до дивного значення 0,00 - .net, postgresql, dataadapter

Запис 0,001 до Postgres 9.x через адаптер даних призводить до дивного значення 0,00 - .net, postgresql, dataadapter

Написання 0.001 до Postgres (9.1 - 9.3) через адаптер даних .net - це дивно 0.00 значення (у pgAdmin), яке відображається як нуль, але ні.

Насправді, прості запити люблять SELECT 1/(SELECT "weird_field" ...) FROM ... коректно дає 1000.

Більш складні запити (з поділом) напрочуд призводять до division by zero помилка

Крім того, замовлення в Navicat правильно показує ці значення між 0,0011 і 0,0009

введіть опис зображення тут

Ми використовуємо бібліотеки Devart для підключення до бази даних, але винуватцем видається адаптер даних (або, принаймні, комбінація цих двох), оскільки простий прямий запит, все ще за допомогою драйверів Devart, не дає однакових результатів.

Будь-яка ідея про те, що відбувається?

--

EDIT:

Тип на БД - numeric, в програмі представлений як double decimal.

pSQL друкує це:

--
0.00
(1 ряд)

--

EDIT 2:

log_statement = "all" дає дивніший результат:

UPDATE "TABLE" SET ... "WEIRD_FIELD"=$8 ... WHERE ...

DETAIL:  parameters: $1 = "7", $2 = "7", $3 = "18", $4 = "18", $5 = "V03", $6 = "Hz",
$7 = "Hz", $8 = "0.00", $9 = "0", $10 = "2", $11 = "0"

Параметр для дивного поля друкується як нуль (0,00), але очевидно, що це не так ...

Зверніть увагу, що значення в DataGridView заповнюється DataAdapter показує правильний 0.001.

--

EDIT 3 (Моріс):

Здається, проблема з адаптером Devartвиправлений. Використовуючи останню версію, я більше не бачу проблеми. Я думаю, це пов'язано з цим конкретним виправленням: 7.3.293 20 листопада 14: Виправлена ​​помилка з втратою точності при роботі з PgSqlType.Numeric через протокол 3 Я модернізував своє програмне забезпечення, використовуючи останні збірки Devart, і тепер все працює, як очікувалося.

Відповіді:

2 для відповіді № 1

Ми виявили, що проблема полягає в тому, як представляє PgSql numerics (десятковий) з невизначеною точністю та масштабом.

Значення в БД здається правильним (0.001), але в деяких операціях він усічений:

"weird_field" + 0.001
---------------------
0.002

але

"weird_field" * 2
--------------------
0.00

і

"weird_field" * 5
--------------------
0.01

Це також пояснює, чому деякі запити дають division by zero помилка

Рішення полягає у визначенні точності та масштабу, наприклад, ми вибрали numeric(38,28) (що ми також використовуємо для десяткової в Oracle) і все працює нормально.

--

Переглядаючи документацію PgSql, ми не знайшли нічого про цю поведінку, тому вважаємо, що це помилка:

Вказуючи:
NUMERIC
без будь-якої точності або масштабу створює стовпецьв якому можуть зберігатися числові значення будь-якої точності та масштабу, аж до обмеження точності. Стовпець такого типу не буде примушувати введені значення до будь-якого конкретного масштабу, тоді як числові стовпці з оголошеним масштабом примушуватимуть введені значення до цього масштабу.

Дивна річ і в тому 0.000001 (et similia) не скорочується, поки 0.001 робить