Rundungsfehler

Hallo,
ich habe ein kleines Problem mit dem Rechnen mit verschiedenen Gleitkommatypen (“PostgreSQL 9.1.3 on i686-pc-linux-gnu, compiled by gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit”):
select 1.74::real * 1; ergibt 1.74000000953674 :frowning:

select 1.74::real * 1::numeric; ergibt 1.74000000953674

Das Problem ergibt sich wohl beim internen ‘casten’.

Wenn man mit gleichen Typen rechnet, ist das Ergebnis korrekt:
select 1.74::real * 1::real; ergibt 1.74 :slight_smile:

Ist das ein Bug oder muss man das einfach wissen, wenn man mit pg arbeitet?

Vielen Dank für Eure Hilfe

Siggi

Das hat nichts mit Postgres zu tun. Das sind die Einschränkungen der float/real Repräsentation auf einem Computer. Deswegen heissen diese Datentype auch “inexact data types” im Handbuch.

Eine kleine Einführung zu der Problematik findest Du hier: http://de.wikipedia.org/wiki/Gleitkommazahl#Eigenschaften_einer_Gleitkommaarithmetik

Das hier könnte auch interessant sein: http://floating-point-gui.de/
Und ganz ausführlich hier: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Wenn die Genauigkeit für Dich wichtig ist, dann nimm decimal (steht auch im Handbuch).

castorp hat Recht. Das sind Fließkommazahlen - diese sind niemals genau. Selbst wenn die Ausgabe dir zwei Mal 1.74 zeigt kann die eine Zahl intern 1.74000000001 und die andere intern 1.73999999999 sein - nur die Darstellung rundet das auf.

Also, nimm NUMERIC/DECIMAL wenn du genaue Zahlen brauchst.