PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como arredondar o tipo REAL para NUMERIC?


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 para numeric(16,2) , que já arredonda à força. Ou ..
    round(abs_km:: numeric(16,2), 2) as round
    round(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.