PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie rundet man REAL-Typ auf NUMERIC?

real ist ein verlustbehafteter, ungenauer Fließkommatyp. Es verwendet nur 4 Bytes für die Speicherung und kann die präsentierten numerischen Literale zunächst nicht genau speichern. Darüber hinaus hängen die Implementierungsdetails von Ihrer Plattform ab. Beachten Sie das Kapitel "Gleitkommatypen" in der Handbuch.

An beiden round() ist nichts falsch oder cast() . Für genaue Ergebnisse müssten Sie numeric verwenden zu beginnen.

Funktionsprüfung

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;
  • Der Sprachname plpgsql darf nicht in Anführungszeichen gesetzt werden . Es ist eine Kennung.
  • Es macht keinen Sinn, nach auf 2 Nachkommastellen zu runden Umwandlung in numeric(16,2) , die schon zwangsweise rundet. Entweder - oder ..

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

Abschließend müssen Sie auf eine aktuelle Version upgraden. Postgres 8.3 hat EOL erreicht und wird nicht mehr unterstützt.