real
è un tipo a virgola mobile con perdita e inesatto. Utilizza solo 4 byte per l'archiviazione e non può memorizzare con precisione i valori letterali numerici presentati per cominciare. Inoltre, i dettagli di implementazione dipendono dalla tua piattaforma. Considera il capitolo "Tipi in virgola mobile" nel manuale.
Non c'è niente di sbagliato in round()
o cast()
. Per risultati esatti, dovresti usare numeric
per cominciare.
Controllo delle funzioni
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;
- Non citare il nome della lingua
plpgsql
. È un identificatore. -
Non ha senso arrotondare a 2 cifre frazionarie dopo trasmettere a
numeric(16,2)
, che arrotonda già forzatamente. O - o ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Infine, è necessario eseguire l'aggiornamento a una versione corrente. Postgres 8.3 ha raggiunto l'EOL e non è supportato.