Arredondar para cima sempre

Delphi

06/05/2004

Seguinte: tenho um cálculo que resulta em um número fracionado. Preciso arredondar sempre para cima. Exemplo: 0.37 teria que ficar 1. Alguém pode ajudar?


Earmarques

Earmarques

Curtidas 0

Melhor post

Ilanocf

Ilanocf

06/05/2004

Olá earmarques,

Tirei estes dois exemplos do DTDelphi

Excelente função para arrendondamento de valores. Alias, a única que funciona. function Arredondar(Valor: Double; Dec: Integer): Double; var Valor1, Numero1, Numero2, Numero3: Double; begin Valor1:=Exp(Ln(10) * (Dec + 1)); Numero1:=Int(Valor * Valor1); Numero2:=(Numero1 / 10); Numero3:=Round(Numero2); Result:=(Numero3 / (Exp(Ln(10) * Dec))); end; {Dica Enviada por Jair Marquetti (jmarquetti@bol.com.br) [url=http://www.lloydsoft.hpg.ig.com.br/falecomigo.htm]usando o formulário do site[/url]}


Exemplo : QryBasico.FieldByName(´Valor´).AsFloat := SimpoRound(Passe Seu Valor Aqui); O Valor passado para a função simporound será arrendodado em um valor exato. Diferente da função round onde ela arredonda o valor mais as vezes arredonda errado. Enviada por: Jason Lopes G Silva (jasonbh@brfree.com.br)


Bem, eu ainda não usei estas funções, de qualquer forma espero ter ajudado.

Ilano.


GOSTEI 1

Mais Respostas

Blivio

Blivio

06/05/2004

Já tentou usar a função RoundTo()? É excelente.


Atenciosamente,


Blivio


GOSTEI 0
Luizf2

Luizf2

06/05/2004

Earmarques,

Você já tentou usar a funcão ´Ceil´?

Esta função retorna o menor inteiro, maior que o número passado como parâmetro, por exemplo Ceil(2.8) = 3, ou Ceil(0.37) = 1.

[]´s

Luiz Fernando


GOSTEI 1
Wagnerpb

Wagnerpb

06/05/2004

Já pensou em somar mais um e truncar...

1,98 + 1 = 2,98 , Trunc(2.98) = 2

1,05 + 1 = 2,05 , Trunc(2,05) = 2

2,74 + 1 = 3,74 , Trunc(3,74) = 3

Simples né, algumas coisas parecem tão obvias que nem dá para acreditar...


GOSTEI 0
Rodc

Rodc

06/05/2004

Bom, como todos estão dando opiniões e cada uma mais diferente da outra, tb vou falar a minha. Eu tb tenho programas que precisam arrendondar para cima e uso da seguinte forma:

temp := 2.56;
if int(temp) <> temp then
Campo.AsFloat := Int(2.36) + 1;

Funciona muito bem!!!

Rodrigo Cesar dos Santos
NGM Informática


GOSTEI 0
Scv Sistemas

Scv Sistemas

06/05/2004

Como sofri com isso, eu mesmo criei uma função, porém ela sempre arredonda para cima de acordo com as casas decimais que passar como parametro segue:

function ArredUp(nValor: Double; Casas: Integer): Double;
var
  sValor,
  sDecimais,
  sParteValor,
  sNovoValor,
  sCasas :string;
  Ponto,
  I, UltimoDigito  :Integer;
begin

  sCasas := '';//zerar a variável que acrescenta as casas decimais
  for I := 1 to Casas do
    sCasas := sCasas + '0';//quantidade de casas decimais passada na função

  Ponto := Pos(',',FormatFloat('0.'+sCasas, nValor));//verifica onde esta a vírgula que separa as casas decimais, de acordo com o parametro de quantidade de casas passado
  sValor := FloatToStr(nValor); //grava o valor numa string para separação das casas decimais
  sDecimais := Trim(Copy(sValor, Ponto + 1, length(sValor)));//pega as casas decimais do jeito que veio sem tratamento
  sParteValor := Trim(Copy(sValor, 1, Ponto - 1));//pegar a parte anterior as casas decimais

  if Length(sDecimais) > Casas then//significa que deu mais doque duas casas decimais depois da vírgula
  begin
    sDecimais  := Trim(Copy(sDecimais ,1 , Casas));//definir a quantidade de casas de acordo com o parametro
    UltimoDigito := StrToInt(Trim(Copy(sDecimais , Length(sDecimais), 1)));//pegar o ultimo digito de casas decimais
    UltimoDigito := UltimoDigito + 1; //como a função mesmo diz, jogar mais um, sempre arredondar o ultimo valor para cima
    sDecimais := Copy(sDecimais, 1, Casas - 1)+IntToStr(UltimoDigito);//jogar o novo ultimo digito calculado somando mais um nos decimais
    sNovoValor := StringReplace(sParteValor,',','',[rfReplaceAll])+','+sDecimais;//define o novo valor gerado
    Result := StrToFloat(sNovoValor);//retornar o novo valor gerado
  end
  else
    Result := nValor;//caso não seja maior, apenas devolver o valor que veio
end;

//execmplo de uso
nResultado := ArredUP(1.233, 2); {valor vai ficar 1,24}
GOSTEI 0
Raylan Zibel

Raylan Zibel

06/05/2004

GOSTEI 0
Sismais Tecnologia

Sismais Tecnologia

06/05/2004

Olá earmarques,

Tirei estes dois exemplos do DTDelphi

Excelente função para arrendondamento de valores. Alias, a única que funciona. function Arredondar(Valor: Double; Dec: Integer): Double; var Valor1, Numero1, Numero2, Numero3: Double; begin Valor1:=Exp(Ln(10) * (Dec + 1)); Numero1:=Int(Valor * Valor1); Numero2:=(Numero1 / 10); Numero3:=Round(Numero2); Result:=(Numero3 / (Exp(Ln(10) * Dec))); end; {Dica Enviada por Jair Marquetti (jmarquetti@bol.com.br) [url=http://www.lloydsoft.hpg.ig.com.br/falecomigo.htm]usando o formulário do site[/url]}


Exemplo : QryBasico.FieldByName(´Valor´).AsFloat := SimpoRound(Passe Seu Valor Aqui); O Valor passado para a função simporound será arrendodado em um valor exato. Diferente da função round onde ela arredonda o valor mais as vezes arredonda errado. Enviada por: Jason Lopes G Silva (jasonbh@brfree.com.br)


Bem, eu ainda não usei estas funções, de qualquer forma espero ter ajudado.

Ilano.





Esta função não está arredondando sempre pra cima. Exemplo: 18,985 retorna: 18,98 (mesmo resultado do SimpleRoundTo, e padrão ABNT)
GOSTEI 0
Sismais Tecnologia

Sismais Tecnologia

06/05/2004

Como sofri com isso, eu mesmo criei uma função, porém ela sempre arredonda para cima de acordo com as casas decimais que passar como parametro segue:

function ArredUp(nValor: Double; Casas: Integer): Double;
var
  sValor,
  sDecimais,
  sParteValor,
  sNovoValor,
  sCasas :string;
  Ponto,
  I, UltimoDigito  :Integer;
begin

  sCasas := '';//zerar a variável que acrescenta as casas decimais
  for I := 1 to Casas do
    sCasas := sCasas + '0';//quantidade de casas decimais passada na função

  Ponto := Pos(',',FormatFloat('0.'+sCasas, nValor));//verifica onde esta a vírgula que separa as casas decimais, de acordo com o parametro de quantidade de casas passado
  sValor := FloatToStr(nValor); //grava o valor numa string para separação das casas decimais
  sDecimais := Trim(Copy(sValor, Ponto + 1, length(sValor)));//pega as casas decimais do jeito que veio sem tratamento
  sParteValor := Trim(Copy(sValor, 1, Ponto - 1));//pegar a parte anterior as casas decimais

  if Length(sDecimais) > Casas then//significa que deu mais doque duas casas decimais depois da vírgula
  begin
    sDecimais  := Trim(Copy(sDecimais ,1 , Casas));//definir a quantidade de casas de acordo com o parametro
    UltimoDigito := StrToInt(Trim(Copy(sDecimais , Length(sDecimais), 1)));//pegar o ultimo digito de casas decimais
    UltimoDigito := UltimoDigito + 1; //como a função mesmo diz, jogar mais um, sempre arredondar o ultimo valor para cima
    sDecimais := Copy(sDecimais, 1, Casas - 1)+IntToStr(UltimoDigito);//jogar o novo ultimo digito calculado somando mais um nos decimais
    sNovoValor := StringReplace(sParteValor,',','',[rfReplaceAll])+','+sDecimais;//define o novo valor gerado
    Result := StrToFloat(sNovoValor);//retornar o novo valor gerado
  end
  else
    Result := nValor;//caso não seja maior, apenas devolver o valor que veio
end;

//execmplo de uso
nResultado := ArredUP(1.233, 2); {valor vai ficar 1,24}


A função parece boa, mas o arredondar sempre pra cima deveria ser aplicado quando o último decimal for 5. Nesta função ai Se o decimal for menor que 5 também está arredondando pra cima.
Ex: 18,981 arredonda para 18,99.
GOSTEI 0
Gladstone Matos

Gladstone Matos

06/05/2004

valorParcelaCalculado := StrToFloat(FormatFloat('0.00',valorParcelaCalculado));
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

06/05/2004

Este assunto é sempre polêmico.

Existem 4 maneiras possíveis de se arredondar:

Para "baixo" (em módulo), quando simplesmente truncamos os decimais. A função Int() ou Trunc() fazem isso, sendo que a primeira retorna um float e a segunda um inteiro.
Para baixo (sempre), quando retornamos o maior inteiro, menor ou igual ao valor. Isto é feito pela função Floor().
Para cima (sempre), quando retornamos o menor inteiro, maior ou igual ao valor. Isto é feito pela função Ceil().

A função Round() arredonda o valor fracionário para o inteiro mais próximo. Porém, existem duas vertentes, que podem ser inclusive ajustadas através de flags do processador:

Arredondamento financeiro: Arredonda para o inteiro mais próximo. Se a parte fracionária for 0.5, arredonda para cima (em módulo?). Não me lembro de -0.5 arredonda para 0 ou -1. Eu chutaria -1.
Arredondamento científico: Arredonda para o inteiro mais próximo. Se a parte fracionária for 0.5, arredonda para o par mais próximo. 1.5 -> 2 e 2.5 -> 2

A função descrita originalmente se assemelha ao Ceil(). Porém, esta função geralmente retorna inteiros. Precisa ver se os valores não ultrapassam a capacidade.
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

06/05/2004

Talvez dê para utilizar:

V := Int(V)+Sign(Frac(V));

Onde Sign(V) representa o sinal: -1 para negativos, +1 para positivos e 0 se for zero.

Desta forma, truncamos o número e, somamos 1 de acordo com o sinal da parte fracionária do valor.
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

06/05/2004

Talvez dê para utilizar:

V := Int(V)+Sign(Frac(V));

Onde Sign(V) representa o sinal: -1 para negativos, +1 para positivos e 0 se for zero.

Desta forma, truncamos o número e, somamos 1 de acordo com o sinal da parte fracionária do valor.
GOSTEI 0
POSTAR