sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo redondear el tipo REAL a NUMÉRICO?

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 round
    round(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.