real
ist ein verlustbehafteter, ungenauer Fließkommatyp. Es verwendet nur 4 Bytes für die Speicherung und kann die präsentierten numerischen Literale zunächst nicht genau speichern. Darüber hinaus hängen die Implementierungsdetails von Ihrer Plattform ab. Beachten Sie das Kapitel "Gleitkommatypen" in der Handbuch.
An beiden round()
ist nichts falsch oder cast()
. Für genaue Ergebnisse müssten Sie numeric
verwenden zu beginnen.
Funktionsprüfung
CREATE OR REPLACE FUNCTION test3()
RETURNS void AS
$func$
DECLARE
r record;
BEGIN
FOR r IN
SELECT abs_km AS km
,cast(abs_km AS numeric) AS km_cast
,round(abs_km::numeric, 2) AS km_round
FROM gps_entry
LOOP
RAISE NOTICE 'km: % , km_cast: % , km_round: %'
, r.km, r.km_cast, r.km_round;
INSERT INTO test (km, casting, rounding)
VALUES (r.km, r.km_cast, r.km_round);
END LOOP;
END
$func$ LANGUAGE plpgsql;
- Der Sprachname
plpgsql
darf nicht in Anführungszeichen gesetzt werden . Es ist eine Kennung. -
Es macht keinen Sinn, nach auf 2 Nachkommastellen zu runden Umwandlung in
numeric(16,2)
, die schon zwangsweise rundet. Entweder - oder ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Abschließend müssen Sie auf eine aktuelle Version upgraden. Postgres 8.3 hat EOL erreicht und wird nicht mehr unterstützt.