São elas: Round(), RoundTo(), SimpleRoundTo(), SetRoundMode() e GetRoundMode().
Abordarei agora cada uma de forma conceitual e prática:
- function Round(X: Real): Int64;
A função Round retorna um valor inteiro arredondado para o número inteiro mais próximo do valor passado como parâmetro. Ela utiliza por padrão o método de arredondamento do banqueiro(ver nota).
Parâmetros:
X: Valor a ser arredondado.
Exemplos:
Round(12.6); //retorna 13
Round(13.4); //retorna 13
Round(13.5); //retorna 14
Round(14.5); //retorna 14
Round(15.5); //retorna 16
Nota: Para maiores informações sobre o método de arredondamento do banqueiro ver “Rotinas matemáticas para manipulação numérica”.
Nota 1: O resultado pode ser diferente se a forma como a FPU(Float Point Unit) lida com questões de arredondamento for alterada através da função SetRoundMode.
- function RoundTo(const Avalue: Extended; const Adigit: TroundToRange): Extended;
O que difere a função RoundTo da Round é o fato de podermos arredondar números com casas decimais. Também utiliza o "arredondamento do banqueiro".
Parâmetros:
Avalue: Valor a ser arredondado.
Adigit: Na prática é a quantidade de dígitos que se deseja arredondar Avalue. Por exemplo, se você deseja arredondar um valor que possui três casas decimais para um novo valor com duas casas decimais, então informe nesse parâmetro o valor -2.
Adigit aceita valores entre -37 a 37(inclusive).
Exemplos:
//retorna 1235000
RoundTo (1.234, -2); //retorna 1.23
RoundTo (1.235, -2); //retorna 1.24
RoundTo (1.245, -2); //retorna 1.24
- function SimpleRoundTo(const AValue: Single(Double ou Extended); const ADigit: TRoundToRange = -2): Single(Double ou Extended);
A função SimpleRoundTo arredonda um valor real para um determinado dígito ou potência de dez.
Utiliza o "arredondamento aritmético assimétrico", ou seja, aquele que aprendemos na escola, onde arredondamos para cima os valores terminados em 5,6,7,8 e 9 e para baixo os terminados em 1,2,3,4.
Parâmetros:
Avalue: Valor a ser arredondado.
Adigit: Na prática é a quantidade de dígitos que se deseja arredondar Avalue. Por exemplo, se você deseja arredondar um valor que possui quatro casas decimais para um novo valor com três casas decimais, então informe nesse parâmetro o valor -3. O valor default de Adigit é -2.
Exemplos:
//retorna 1235000
SimpleRoundTo (1.234, -2); //retorna 1.23
SimpleRoundTo (1.235, -2); //retorna 1.24
SimpleRoundTo (-1.235, -2); //retorna - 1.23
-function SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode; Define a forma com que a FPU irá lidar com questões de arredondamento.
Valor | Significado |
rmNearest | Arredonda para o valor mais próximo e é o modo default. |
rmDown | Arredonda para baixo. |
rmUp | Arredonda para cima. |
rmTruncate | Trunca o valor. |
Exemplos:
program Project2;
uses
math, sysutils, clipbrd;
var
s: string;
procedure trythis(sMode: string);
procedure tryone(d: double);
begin
s := s + Format(''%1.3f %d%s'', [d, Round(d), #13 + #10]);
end;
begin
s := s + #13#10 + sMode + #13#10;
tryone(0.50);
tryone(1.50);
tryone(2.45);
tryone(2.50);
tryone(2.55);
tryone(3.45);
tryone(3.50);
tryone(3.55);
end;
begin
s := inttostr(integer(GetRoundMode));
SetRoundMode(rmNearest);
trythis(''nearest'');
SetRoundMode(rmDown);
trythis(''down'');
SetRoundMode(rmUp);
trythis(''up'');
SetRoundMode(rmTruncate);
trythis(''trunc'');
Clipboard.Astext := s;
end.
Execute o programa, depois dê um Ctrl+C no Bloco de Notas. Agora analise os resultados comparando com cada modo de arredondamento.
- function GetRoundMode: TFPURoundingMode;
Retorna a forma com que a FPU lida com questões de arredondamento.
Exemplo:
if (GetRoundMode <> rmNearest) then
begin
if (MessageDlg(''Modo de arredondamento Alterado!'' + #10#13 +
''Deseja voltar configuração Default?'', mtConfirmation, [mbYes, mbNo], 0)
= mrYes) then
begin
SetRoundMode(rmNearest);
end;
end;
É isso, qualquer dúvida ou sugestão é só deixar um comentário ou me enviar um e-mail.
Até a próxima e obrigado.