real
er en tabsgivende, upræcis flydende kommatype. Den bruger kun 4 bytes til lagring og kan ikke gemme de præsenterede numeriske bogstaver præcist til at begynde med. Derudover afhænger implementeringsdetaljer af din platform. Overvej kapitlet "Floating-Point Types" i manual.
Der er ikke noget galt med hverken round()
eller cast()
. For nøjagtige resultater skal du bruge numeric
til at begynde med.
Funktionsrevision
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;
- Anfør ikke sprognavnet
plpgsql
. Det er en identifikator. -
Giver ingen mening at afrunde til 2 brøkcifre efter casting til
numeric(16,2)
, som tvangsrunder allerede. Enten - eller ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Endelig skal du opgradere til en aktuel version. Postgres 8.3 har nået EOL og understøttes ikke.