Ich bin ziemlich vertraut damit, wie die IEEE 754 Single Precision und Double Precisions Datentypen ihre Überlegenheit haben. Ich habe die Artikel darüber gelesen, was jeder Informatiker über Gleitkommaarithmetik wissen sollte, aber ich bin verwirrt über eine Entscheidung, die Postgresql trifft.Was bestimmt den Datentyp, nach dem PostgreSQL gefiltert wird?
ich eine Tabelle
create table ttt(f4 float4, f8 float8, fn numeric);
ich einige Werte hinzufügen:
insert into ttt (f4,f8,fn) values(12.206,12.206,12.206);
Ich habe eine Abfrage:
select count(*) from ttt where f4=12.206;
count
-------
0
(1 row)
ich um eine Erklärung bitten:
gsh=# explain select count(*) from ttt where f4=12.206;
QUERY PLAN
----------------------------------------------------------
Aggregate (cost=23.77..23.78 rows=1 width=0)
-> Seq Scan on ttt (cost=0.00..23.75 rows=6 width=0)
Filter: (f4 = 12.206::double precision)
(3 rows)
So versucht die Abfrage, die Doppelpräzisionsversion von 12.206 mit dem als Einzelpräzision gespeicherten Wert zu vergleichen, und sie sind nicht passend, was keine Überraschung ist.
Was mir eine Überraschung ist, dass standardmäßig postgresql seit scheinen Zahlen als numerisches zu behandeln:
gsh=# select 12.206;
?column?
----------
12.206
(1 row)
gsh=# select pg_typeof(12.206);
pg_typeof
-----------
numeric
(1 row)
Wenn Zahlen standardmäßig als numerisch behandelt werden, warum nicht die Filter gegen 12,206 Vergleichen als eine numerische anstelle einer doppelten Genauigkeit? Ich finde das eine Verletzung der geringsten Überraschung.
Irgendwelche Gedanken?