real
jest stratnym, niedokładnym typem zmiennoprzecinkowym. Używa tylko 4 bajtów do przechowywania i nie może dokładnie przechowywać prezentowanych literałów numerycznych. Ponadto szczegóły implementacji zależą od Twojej platformy. Rozważ rozdział „Typy zmiennoprzecinkowe” w instrukcja.
Nie ma nic złego w round()
lub cast()
. Aby uzyskać dokładne wyniki, musisz użyć numeric
na początek.
Audyt funkcji
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;
- Nie cytuj nazwy języka
plpgsql
. To identyfikator. -
Nie ma sensu zaokrąglać do 2 cyfr ułamkowych po rzutowanie na
numeric(16,2)
, który na siłę już zaokrągla. Albo - albo ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Na koniec musisz uaktualnić do aktualnej wersji. Postgres 8.3 osiągnął EOL i nie jest obsługiwany.