/ / Zápis 0,001 na Postgres 9.x pomocou dátového adaptéra vedie k zvláštnej hodnote 0,00 - .net, postgresql, dataadapter

Zápis 0,001 do Postgres 9.x cez dátový adaptér vedie k podivnej hodnote 0,00 - .net, postgresql, dataadapter

písanie 0.001 na Postgres (9,1 až 9,3) cez dátový adaptér .net vedie k podivnému 0.00 hodnota (v pgAdmin), ktorá sa javí ako nula, ale nie je.

Jednoduché dotazy ako SELECT 1/(SELECT "weird_field" ...) FROM ... správne dáva 1000.

Zložitejšie dotazy (s rozdelením) majú prekvapivo za následok a division by zero chyba.

Aj zoradenie podľa Navicatu správne zobrazuje tieto hodnoty medzi 0,0011 a 0,0009

tu zadajte popis obrázku

Na pripojenie k databáze používame knižnice Devart, ale zdá sa, že vinníkom je dátový adaptér (alebo aspoň kombináciu týchto dvoch parametrov), pretože jednoduchý priamy dopyt, stále prostredníctvom ovládačov Devart, neprináša rovnaký výsledok.

Máte nejakú predstavu o tom, čo sa deje?

--

EDIT:

Typ na DB je numeric, v programe je zastúpený ako double decimal.

pSQL toto vytlačí:

--
0.00
(1 riadok)

--

EDIT 2:

log_statement = "all" dáva divnejší výsledok:

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"

Parameter čudného poľa je vytlačený ako nula (0,00), ale zjavne to nie je ...

Všimnite si, že hodnota v DataGridView je vyplnená DataAdapterom ukazuje správne 0.001.

--

EDIT 3 (Maurice):

Zdá sa, že problém s adaptérom Devart jeopravený. Používanie najnovšej verzie už problém nevidím. Myslím, že to súvisí s touto konkrétnou opravou: 7.3.293 20. novembra-14: Chyba so stratou presnosti pri práci s PgSqlType. Číselná hodnota cez protokol 3 je opravená Aktualizoval som svoj softvér pomocou najnovších zostáv Devart a teraz všetko funguje podľa očakávaní.

odpovede:

2 pre odpoveď č. 1

Zistili sme, že problém je v tom, ako predstavuje PgSql numerics (desatinné miesto) s nešpecifikovanou presnosťou a mierkou.

Hodnota v DB sa zdá byť správna (0.001), ale v niektorých operáciách je skrátený:

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

ale

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

a

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

To tiež vysvetľuje, prečo niektoré dotazy poskytujú a division by zero chyba.

Riešením je určiť presnosť a mierku, napríklad sme si vybrali numeric(38,28) (ktoré tiež v Oracle používame na desatinné miesta) a všetko funguje dobre.

--

Pri prezeraní dokumentácie PgSql sme o tomto správaní nenašli nič, takže veríme, že ide o chybu:

Špecifikácia:
NUMERIC
bez akejkoľvek presnosti alebo mierky vytvorí stĺpecv ktorých je možné ukladať číselné hodnoty akejkoľvek presnosti a mierky, až do limitu presnosti implementácie. Stĺpec tohto druhu nebude vynucovať vstupné hodnoty do žiadnej konkrétnej mierky, zatiaľ čo číselné stĺpce s deklarovanou mierkou vynútia vstupné hodnoty do tejto mierky.

Zvláštna vec je tiež to 0.000001 (et similia) sa zatiaľ nezkráti 0.001 robí.