sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL round(v numerisk, s int)

Det är inte dokumenterat, så det kan ändras.

Här är 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;

Och 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 hanterar cirka 500 000 anrop per sekund, 6 gånger långsammare än en vanlig round(numeric,integer) . De fungerar också för noll och för negativ precision.



  1. Fix Msg 8116 "Argumentdatatypen varchar är ogiltig för argument 1 för session_context-funktionen" i SQL Server

  2. Hur man returnerar dagnumret med ett suffix i MariaDB

  3. Hur ställer jag in en standard standardbild (no_pic.gif) php?

  4. Utlösare för att infoga rader i fjärrdatabas efter radering