sexta-feira, 22 de abril de 2016

Delphi - Arredondamento de valores

Essa função de arredondamento de valor monetário tem opcão de arredondar para mais ou para menos:

function ArredDinheiro(Fracao: Double; Cima : Boolean): Double;
var
  Sinal : integer;
begin
  Fracao := Fracao * 100;
  // Sng
  if Frac(Fracao) < 0 then
    Sinal := -1
  else if Frac(Fracao) = 0 then
    Sinal := 0
  else
    Sinal := 1;
  if Cima then
  begin
    Result := (Int(Fracao) + (Sinal));
  end
  else
  begin
    Result := Int(Fracao);
  end;
  Result := result / 100;
end;

Outras funções de arredondamento que podem ser úteis:

function Sgn(X: Extended): Integer;
{ Retorna -1, 0 or 1 de acordo com o sinal do argumento }
begin
  if X < 0 then
    Result := -1
  else
    if X = 0 then
      Result := 0
    else
      Result := 1;
end;
function RoundUp(X: Extended): Extended;
{ Retorna o primeiro inteiro maior que ou igual a um
  dado número em valor absoluto (o sinal e preservado).
  RoundUp(3,3) = 4    RoundUp(-3,3) = -4 }
begin
  Result := Int(X) + Sgn(Frac(X));
end;
function RoundDn(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número em  valor absoluto (o sinal é preservado).
  RoundDn(3,7) = 3    RoundDn(-3,7) = -3
begin
  Result := Int(X);
end;
function RoundN(X: Extended): Extended;
{ Arredonda um número "normalmente": caso a parte de fração
  seja >= 0,5 o número será arredondado “para cima” (ver RoundUp)
  caso contrário, se a parte de fração for < 0,5, o
  número será arredondado “para baixo” (ver RoundDn).
  RoundN(3,5) = 4     RoundN(-3,5) = -4
  RoundN(3,1) = 3     RoundN(-3,1) = -3 }
begin
  (*
  if Abs(Frac(X)) >= 0.5 then
    Result := RoundUp(X)
  else
    Result := RoundDn(X);
  *)
    Result := Int(X) + Int(Frac(X) * 2);
end;
function Fix(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número.
  Int(3,7) = 3          Int(-3,7) = -3
  Fix(3,7) = 3          Fix(-3,1) = -4 }
begin
  if (X >= 0) or (Frac(X) = 0) then
    Result := Int(X)
  else
    Result := Int(X) - 1;
end;
function RoundDnX(X: Extended): Extended;
{ Retorna o primeiro inteiro menor que ou
  igual a um dado número.
  RoundDnX(3,7) = 3     RoundDnX(-3,7) = -3
  RoundDnX(3,7) = 3     RoundDnX(-3,1) = -4 }
begin
  Result := Fix(X);
end;


function RoundUpX(X: Extended): Extended;
{ Retorna o primeiro inteiro maior que ou
  igual a um dado número.
  RoundUpX(3,1) = 4     RoundUpX(-3,7) = -3 }
begin
  Result := Fix(X) + Abs(Sgn(Frac(X)))
end;
function RoundX(X: Extended): Extended;
{ Arredonda o número "normalmente", porém levando em conta o sinal:
  se a parte de fração for >= 0,5, o número
  será arredondado “para cima” (ver RoundUpX)
  caso contrario, se a parte de fração for < 0,5,

  o número será arredondado “para baixo” (ver RoundDnX).
  RoundX(3,5) = 4     RoundX(-3,5) = -3 }
begin
  (*
  if Abs(Frac(X)) >= 0,5 then
    Result := RoundUpX(X)
  else
    Result := RoundDnX(X);
  *)
    Result := Fix(X + 0.5);
end;

Nenhum comentário:

Postar um comentário

Oracle - Listar datas do mês

 select TRUNC(SYSDATE)  + level - 1 dt from   dual connect by level <= (   LAST_DAY(SYSDATE) - TRUNC(SYSDATE) + 1 )