sql >> Database >  >> RDS >> PostgreSQL

Hoe het REAL-type naar NUMERIEK af te ronden?

real is een verliesgevend, onnauwkeurig type met drijvende komma. Het gebruikt slechts 4 bytes voor opslag en kan de gepresenteerde numerieke letterlijke waarden om te beginnen niet precies opslaan. Bovendien zijn implementatiedetails afhankelijk van uw platform. Overweeg het hoofdstuk "Floating-Point Types" in de handleiding.

Er is niets mis met round() of cast() . Voor exacte resultaten moet u numeric . gebruiken om mee te beginnen.

Functie-audit

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;
  • Citeer niet de taalnaam plpgsql . Het is een identificatie.
  • Het heeft geen zin om na af te ronden op 2 decimalen casten naar numeric(16,2) , die al met geweld ronddraait. Of - of ..

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

Ten slotte moet u upgraden naar een huidige versie. Postgres 8.3 heeft EOL bereikt en wordt niet ondersteund.




  1. PostgreSQL - Gecorreleerde subquery mislukt?

  2. Recursieve CTE schrijven met behulp van Entity Framework Fluent-syntaxis of Inline-syntaxis

  3. Vensterfuncties SORTEREN kostbaar, kunnen we het oplossen?

  4. Spring boot JPA:Gebruik bibliotheek om gegevens in bulk te laden voor MySQL