Fórum Arredondamento de valor $ #183267
20/09/2003
0
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
Curtir tópico
+ 0Posts
20/09/2003
Mmtoor
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
Gostei + 0
20/09/2003
Dli
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
Gostei + 0
20/09/2003
Cebikyn
[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...
Gostei + 0
20/09/2003
Cebikyn
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.
Gostei + 0
20/09/2003
Dli
O prblema é com os valores que tem uma diferença entre eles de $ 0,01.
[]´s
dli
Gostei + 0
20/09/2003
Cebikyn
Gostei + 0
20/09/2003
Wbb
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
Gostei + 0
20/09/2003
Wbb
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
Gostei + 0
20/09/2003
Dli
Valeu.
[]´s
dli
Gostei + 0
20/09/2003
Mmtoor
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)