sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-ronde (v numeriek, s int)

Het is niet gedocumenteerd, dus het kan veranderen.

Hier zijn mijn 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;

En 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;

Ze beheren ongeveer 500000 aanroepingen per seconde, 6 keer langzamer dan een standaard round(numeric,integer) . Ze werken ook voor nul en voor negatieve precisie.



  1. Objecten vergelijken op waarde. Deel 6:Implementatie van structuurgelijkheid

  2. IndexOf-functie in T-SQL

  3. Wat is DBMS? – Een uitgebreide gids voor databasebeheersystemen

  4. Hoe de LOAD_FILE()-functie werkt in MySQL