real
é um tipo de ponto flutuante inexato e com perdas. Ele usa apenas 4 bytes para armazenamento e não pode armazenar os literais numéricos apresentados precisamente para começar. Além disso, os detalhes de implementação dependem da sua plataforma. Considere o capítulo "Tipos de ponto flutuante" no manuais.
Não há nada de errado com
round()
ou cast()
. Para resultados exatos, você teria que usar numeric
começar com. Auditoria de funções
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;
- Não cite o nome do idioma
plpgsql
. É um identificador. -
Não faz sentido arredondar para 2 dígitos fracionários depois transmitindo paranumeric(16,2)
, que já arredonda à força. Ou ..
round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Finalmente, você precisa atualizar para uma versão atual. O Postgres 8.3 atingiu o EOL e não é compatível.