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

PostgreSQL runde(v numerisk, s int)

Det er ikke dokumenteret, så det kan ændre sig.

Her er min round_half_even(numeric,integer) :

create or replace function round_half_even(val numeric, prec integer)
    returns numeric
as $$
declare
    retval numeric;
    difference numeric;
    even boolean;
begin
    retval := round(val,prec);
    difference := retval-val;
    if abs(difference)*(10::numeric^prec) = 0.5::numeric then
        even := (retval * (10::numeric^prec)) % 2::numeric = 0::numeric;
        if not even then
            retval := round(val-difference,prec);
        end if;
    end if;
    return retval;
end;
$$ language plpgsql immutable strict;

Og round_half_odd(numeric,integer) :

create or replace function round_half_odd(val numeric, prec integer)
    returns numeric
as $$
declare
    retval numeric;
    difference numeric;
    even boolean;
begin
    retval := round(val,prec);
    difference := retval-val;
    if abs(difference)*(10::numeric^prec) = 0.5::numeric then
        even := (retval * (10::numeric^prec)) % 2::numeric = 0::numeric;
        if even then
            retval := round(val-difference,prec);
        end if;
    end if;
    return retval;
end;
$$ language plpgsql immutable strict;

De håndterer omkring 500.000 opkald pr. sekund, 6 gange langsommere end en standard round(numeric,integer) . De arbejder også for nul og for negativ præcision.



  1. Mysql - 1045 - Adgang nægtet for brugeren 'user'@'localhost' (ved hjælp af adgangskode:Ja)

  2. Vis forældre-barn-relation, når forældre og barn er gemt i samme tabel

  3. Dvale Kan ikke tilføje eller opdatere en underordnet række:en fremmednøglebegrænsning mislykkes

  4. Connection Pool-strategi:god, dårlig eller grim?