Arredondar para cima sempre
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
Curtidas 0
Melhor post
Ilanocf
06/05/2004
Olá earmarques,
Tirei estes dois exemplos do DTDelphi
Bem, eu ainda não usei estas funções, de qualquer forma espero ter ajudado.
Ilano.
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
06/05/2004
Já tentou usar a função RoundTo()? É excelente.
Atenciosamente,
Blivio
Atenciosamente,
Blivio
GOSTEI 0
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
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
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...
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
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
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
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
Sismais Tecnologia
06/05/2004
Olá earmarques,
Tirei estes dois exemplos do DTDelphi
Bem, eu ainda não usei estas funções, de qualquer forma espero ter ajudado.
Ilano.
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
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
06/05/2004
valorParcelaCalculado := StrToFloat(FormatFloat('0.00',valorParcelaCalculado));
GOSTEI 0
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.
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
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.
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
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.
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