Rotinas de arredondamento: Round, RoundTo, SimpleRoundTo, SetRoundMode e GetRoundMode

Como falei no meu último artigo sobre “Rotinas matemáticas para manipulação numérica” estarei hoje falando das rotinas nativas do Delphi para arredondamento.

É comum na vida do programado deparar-se com situações em que necessite arredondar um determinado valor, ou utilizando o arredondamento para cima ou o arredondamento do banqueiro e ainda definir a quantidade de casas decimais, isso se for ter casas decimais.

O que alguns não sabem é que o Delphi oferece suporte para estas formas de arredondamento, basta um pouco de dedicação para entendermos melhor a forma de configurar e o comportamento dessas rotinas.

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:

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
Código 1. Exemplos uso do método Round()

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. 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).

//retorna 1235000 RoundTo(1.234, -2); //retorna 1.23 RoundTo(1.235, -2); //retorna 1.24 RoundTo(1.245, -2); //retorna 1.24
Código 2. Exemplos uso do método RoundTo()

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. 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
Código 3. Exemplos uso do método SimpleRoundTo()

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.
Tabela 1. Modos de arredondamento
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.
Código 4. Exemplos de modos de arredondamentos

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.

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;
Código 5. Exemplos de modo de arredondamentos

Aplicações Práticas e Casos de Uso

1. Aplicações Financeiras

O arredondamento preciso é essencial, por exemplo, no cálculo de juros compostos ou arredondamento de valores monetários, desta forma a forma do método de arredondamento pode impactar nos resultados.

2. Processamento de Dados Científicos

Em projetos científicos e de engenharia, comumente lidamos com números de alta precisão. Desta forma o uso de rotinas como RoundTo() permitirá arredondarmos os resultados para o número de casas decimais desejados, o que facilita a análise e apresentação dos dados.

3. Jogos e Simulações

O arredondamento é muito usado para simplificar cálculos de física. Por exemplo, o método SimpleRoundTo() pode ser usado para acertar a posição de um objeto ou calcular a pontuação de um jogador.

4. Aplicações de Contabilidade

Softwares de contabilidade necessitam de alta precisão nos cálculos de valores monetários. Por isso é essencial utilizar rotinas de arredondamento adequadas, para garantir valores finais precisos e conforme as devidas regras contábeis.

5. Interfaces de Usuário

A exibição de dados numéricos numa interface ao usuário, comumente são arredondados os valores para melhorar sua legibilidade. Por exemplo, em gráficos e tabelas, isso porque valores arredondados são mais fáceis de entender para os usuários.

Método Round para Normalização de Dados com IA

A normalização de dados é um passo fundamental no processo de treinamento de modelos de inteligência artificial. Isso porque ajustam os valores de diferentes características, o que melhora o desempenho e a junção dos algoritmos de aprendizado de máquina. O método Round() pode ser usado para arredondar valores normalizados a um número fixo de casas decimais.

1. O Papel da Normalização em IA

2. Integração com Modelos de IA

Depois que os dados são normalizados e arredondados, podemos usá-los como entrada para os modelos de IA. Isso garantirá que todas as características tenham a mesma escala, o que facilitará todo o aprendizado do modelo.

A normalização de dados é uma etapa fundamental no desenvolvimento de modelos de inteligência artificial, e o método Round() é uma ferramenta valiosa nesse processo. Arredondamento de valores normalizados permitirá precisão e consistência nos dados para treinamento de modelos de IA.

É isso, qualquer dúvida ou sugestão é só deixar um comentário.Até a próxima e obrigado.

Artigos relacionados