GARANTIR DESCONTO

Fórum Arredondamento de valor $ #183267

20/09/2003

0

Boa tarde,

Preciso saber como arredondar 2,545 para 2,55. Já tentei utilizar Round(valor.value,5) mas não funciona, dizendo que a virgula está errada.

Utilizo Paradox/tabela e o campo é do tipo $.


Preciso utilizar um código que faço os arrendondamentos , baseados na regra matemática , ou seja se o terceiro digito depois da virgula for:

4 >>> não arredonda --->>> 2,544 ----->>>>>>>> ficará 2,54

5 ou maior arredonda para cima >>> 2.545 ->>> ficará 2,55



Obrigado a todos.


dli


Dli

Dli

Responder

Posts

20/09/2003

Mmtoor

Prezado amigo:
No paradox, utilizando o campo currency, ele não gera mais que duas casas decimais.
Pode mandar o código da aritnmética que está utilizando?
MMTOOR2003


Responder

Gostei + 0

20/09/2003

Dli

Estou fazendo o seguinte:

ValorTaxa.value:=(ValorInicial.Value*PercTaxa.Value)/100;
ValorFinal.Value:=ValorInicial.value-ValorTaxa.Value;

Em numeros tá fazendo o seguinte:

ValorTaxa.Value:=(127.25*2)/100

o que resulta :

ValorTaxa.Value:=2.545
ValorFinal:=124.25-2.545 que é 124,705

No banco de dados , grava os seguintes valores:

ValorTaxa.Value:=2.54
ValorFinal:=124.70


Então se voce fizer a soma destes valores , verá que o resultado será $127.24 e não 127,25, ou seja tem uma diferença de 0,01 .



Este é o meu problema,



No entanto


Responder

Gostei + 0

20/09/2003

Cebikyn

Se está dizendo que a virgula está errada, use um dos códigos abaixo antes de arredondar:

[b:bab0c368c0]DecimalSeparator := ´.´;[/b:bab0c368c0]

ou

[b:bab0c368c0]DecimalSeparator := ´,´;[/b:bab0c368c0]

Um deles deve corrigir o erro.

OBS: O [b:bab0c368c0]Round[/b:bab0c368c0] nem sempre segue a regra matemática. Existem algums códigos na internet que ´dizem´ seguir a regra, mas nenhum que eu testei realmente funciona...


Responder

Gostei + 0

20/09/2003

Cebikyn

Acho que encontrei:

function RoundN(x: Extended; d: Integer): Extended;
// RoundN(123.456, 0) = 123.00
// RoundN(123.456, 2) = 123.46
// RoundN(123456, -3) = 123000
const
  t: array [0..12] of int64 = (1, 10, 100, 1000, 10000, 100000,
      1000000, 10000000, 100000000, 1000000000, 10000000000,
      100000000000, 1000000000000);
begin
  if Abs(d) > 12 then
    raise ERangeError.Create(´RoundN: O valor deve estar entre -12..12´);
  if d = 0 then
    Result := Int(x) + Int(Frac(x) * 2)
  else if d > 0 then begin
    x := x * t[d];
    Result := (Int(x) + Int(Frac(x) * 2)) / t[d];
  end else begin  // d < 0
    x := x / t[-d];
    Result := (Int(x) + Int(Frac(x) * 2)) * t[-d];
  end;
end;

E se disser que a vírgula está errada, use a sugestão da minha msg anterior.


Responder

Gostei + 0

20/09/2003

Dli

Desculpe-me mas não é a questão da virgula. Foi um erro de digitação.
O prblema é com os valores que tem uma diferença entre eles de $ 0,01.



[]´s

dli


Responder

Gostei + 0

20/09/2003

Cebikyn

Ver [url=http://delphiforum.icft.com.br/forum/viewtopic.php?p=56749#56749]função a cima[/url], que não se refere à vírgula... a função arredonda os valores seguindo as regras da matemática e provavelmente corrigirá a diferença de 1 centavo.




mas não funciona, dizendo que a virgula está errada.



Responder

Gostei + 0

20/09/2003

Wbb

Dli,

Uma das maneiras é dar uma ´enganada´ no sistema. Não é a melhor maneira, mas funciona.
Tente:

Edit1.Text := FormatFloat(´0.00´, StrToFloat(´2,545´)); // Aqui estou supondo que a informação numérica está em formato String com vírgula.

ou...

Edit1.Text := FormatFloat(´0.00´, 2.545); //Aqui eu suponho que é um real com ponto mesmo, que é o comum.


Com isso, dependendo do seu problema, você pode fazer outras combinações.
Lembro porém, que a função FormatFloat retorna um valor String.

Até mais.
wbb


Responder

Gostei + 0

20/09/2003

Wbb

Só para concluir, que eu havia esquecido, uma outra maneira de dar uma ´enrolada´, é verificando se existe a vírgula no valor antes de tentar manipulá-lo. Se existir, troque por ´ponto´(.) e faça o arredondamento com o Round mesmo.

Use, por exemplo, a função [b:ef866ffd2b]AnsiReplaceStr[/b:ef866ffd2b] para trocar a vírgula por ponto, e a função [b:ef866ffd2b]POS [/b:ef866ffd2b]para identificar se a vírgula existe. Se a virgula sempre existir em todos os valores, então nem precisa identificar nada. Apenas mande trocar e pronto.

wbb


Responder

Gostei + 0

20/09/2003

Dli

A função RoundN apesar de não arredondar o valor de 2,544 para 2,55 u, acabou funcionando, no cálculo final.


Valeu.


[]´s

dli


Responder

Gostei + 0

20/09/2003

Mmtoor

Prezado amigo:
Acho que existe um pequeno problema nesta sua aritmática.
Na realidade, a teceira casa decimal é 5 (2,545), no seu caso, logo, o arredondamento padrão é uma casa acima, e não abaixo, ou seja, o valor correto é realmente 2,55.
MMTOOR2003


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar