17.042013

Runden mit PostgreSQL

Hi,

mein heutiger Blogeintrag wird sehr kurz, da ich aber heute wieder drüber gestolpert bin, muss ich es unbedingt loswerden :-).

Bei Verwendung der "round" Funktion in Postgres ist Vorsicht geboten, das Ergebnis hängt von dem Datentyp ab, den ihr übergebt.

Hier 2 Beispiele:

datenbank=# SELECT round(6.5::numeric);
 round
-------
 7
(1 row)

Soweit ist alles, wie wir es vermutet hätten, aber was passiert, wenn der uebergebene Wert float oder double precision ist?!

datenbank=# SELECT round(6.5::double precision);
 round
-------
 6
(1 row)

Nanu? Was laeuft da denn schief? Probieren wir es doch noch einmal mit einer anderen Zahl aus:

datenbank=# SELECT round(5.5::numeric);
 round
-------
 6
(1 row)

Wieder wie erwartet... Nun double precison:

datenbank=# SELECT round(5.5::double precision);
 round
-------
 6
(1 row)

Huch? Auf einmal passt es ja?

Scheint so, als wuerde Postgres float/double precision Zahlen bei ,5 aufrunden, wenn sie ungerade und abrunden, wenn sie gerade sind.

Getestet habe ich das jetzt mit Postgres 8.4 und Postgres 9.1., in keiner der beiden Dokus konnte ich einen Hinweis darauf finden, ob's nun ein Bug oder ein Feature ist.

Wenn jemand weiß, warum Postgres sich so verhält, so kann er es mir ja verraten :)

 

Gruß