real
is een verliesgevend, onnauwkeurig type met drijvende komma. Het gebruikt slechts 4 bytes voor opslag en kan de gepresenteerde numerieke letterlijke waarden om te beginnen niet precies opslaan. Bovendien zijn implementatiedetails afhankelijk van uw platform. Overweeg het hoofdstuk "Floating-Point Types" in de handleiding.
Er is niets mis met round()
of cast()
. Voor exacte resultaten moet u numeric
. gebruiken om mee te beginnen.
Functie-audit
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;
- Citeer niet de taalnaam
plpgsql
. Het is een identificatie. -
Het heeft geen zin om na af te ronden op 2 decimalen casten naar
numeric(16,2)
, die al met geweld ronddraait. Of - of ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Ten slotte moet u upgraden naar een huidige versie. Postgres 8.3 heeft EOL bereikt en wordt niet ondersteund.