PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come arrotondare il tipo REAL a NUMERIC?

real è un tipo a virgola mobile con perdita e inesatto. Utilizza solo 4 byte per l'archiviazione e non può memorizzare con precisione i valori letterali numerici presentati per cominciare. Inoltre, i dettagli di implementazione dipendono dalla tua piattaforma. Considera il capitolo "Tipi in virgola mobile" nel manuale.

Non c'è niente di sbagliato in round() o cast() . Per risultati esatti, dovresti usare numeric per cominciare.

Controllo delle funzioni

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;
  • Non citare il nome della lingua plpgsql . È un identificatore.
  • Non ha senso arrotondare a 2 cifre frazionarie dopo trasmettere a numeric(16,2) , che arrotonda già forzatamente. 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

Infine, è necessario eseguire l'aggiornamento a una versione corrente. Postgres 8.3 ha raggiunto l'EOL e non è supportato.