PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment arrondir le type REAL à NUMERIC ?

real est un type à virgule flottante avec perte et inexact. Il n'utilise que 4 octets pour le stockage et ne peut pas stocker précisément les littéraux numériques présentés pour commencer. De plus, les détails de mise en œuvre dépendent de votre plate-forme. Considérez le chapitre "Types à virgule flottante" dans le manuel.

Il n'y a rien de mal avec round() ou cast() . Pour des résultats exacts, vous devez utiliser numeric pour commencer.

Audit des fonctions

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;
  • Ne citez pas le nom de la langue plpgsql . C'est un identifiant.
  • Arrondir à 2 chiffres fractionnaires après n'a aucun sens conversion en numeric(16,2) , qui arrondit déjà de force. Soit - soit ..

    round(abs_km:: numeric(16,2), 2) as round
    round(abs_km::numeric, 2) as round
    abs_km::numeric(16,2) as round

Enfin, vous devez effectuer une mise à niveau vers une version actuelle. Postgres 8.3 a atteint la fin de vie et n'est pas pris en charge.