real
е тип със загуби, неточен тип с плаваща запетая. Той използва само 4 байта за съхранение и не може да съхранява прецизно представените числови литерали. Освен това подробностите за внедряването зависят от вашата платформа. Разгледайте главата „Типове с плаваща запетая“ в ръководство.
Няма нищо лошо нито в round()
или cast()
. За точни резултати ще трябва да използвате numeric
като начало.
Одит на функция
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;
- Не цитирайте името на езика
plpgsql
. Това е идентификатор. -
Няма смисъл да се закръглява до 2 дробни цифри след прехвърляне към
numeric(16,2)
, който принудително закръгля вече. Или - или ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
И накрая, трябва да надстроите до текуща версия. Postgres 8.3 достигна EOL и не се поддържа.