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