real
es un tipo de punto flotante inexacto y con pérdidas. Solo usa 4 bytes para el almacenamiento y no puede almacenar los literales numéricos presentados precisamente para empezar. Además, los detalles de implementación dependen de su plataforma. Considere el capítulo "Tipos de punto flotante" en el manuales.
No hay nada malo con round()
o cast()
. Para obtener resultados exactos, tendría que usar numeric
para empezar.
Auditoría de funciones
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;
- No cite el nombre del idioma
plpgsql
. Es un identificador. -
No tiene sentido redondear a 2 dígitos fraccionarios después conversión a
numeric(16,2)
, que ya redondea a la fuerza. O - o ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Finalmente, debe actualizar a una versión actual. Postgres 8.3 alcanzó el EOL y no es compatible.