A função Math.RoundTo do Delphi não faz o arredondamento correto de acordo com o modelo Bankers’s Rounding (diferente do que está no Help). Isso se deve por causa do uso interno de varáveis de tipo flutuante. Segue abaixo uma versão dessa função que trabalha somente com variáveis do tipo Currency e por isso funciona corretamente.
function RoundTo(const AValue: Currency; const ADigit: TRoundToRange): Currency; var LFactor: Extended; rmOrig: TFPURoundingMode; begin LFactor := IntPower(10, ADigit); Result := Round(AValue / LFactor) * LFactor; rmOrig := GetRoundMode(); if rmOrig <> rmNearest then begin SetRoundMode(rmNearest); Result := Round(Result / LFactor) * LFactor; SetRoundMode(rmOrig); end; end;
Valeu, funcionou perfeitamente..parabéns…!!!!
Abraços.
Parabéns pela função.
Tenho uma dúvida: Para arredondar valores para cima, utilizo digito positivo ou negativo.
Obrigado.
Neste caso, utilize a função “Math.RoundTo”. Mas antes, configure o tipo de arredondamente para “rmUp”. Exemplo:
SetRoundMode(rmUp);
nValor := RoundTo(15.293, -2);