Fórum erro ao truncar #445626

17/06/2013

0

Ao tentar pegar a parte inteira de um numero usando a função trunc o valor é alterado

function TruncaCasasDecimais(valor: double): String;
var
    parteInteira: string;
begin
    //...

    //quando passo o valor 464 obtenho 463 na variavel parteInteira
    parteInteira:= Inttostr(trunc(valor));

    //...
end


a chamada esta assim

var
    qtd, valor: double;
begin
    qtd := 50;
    valor := 9.28;
    variavel := TruncaCasasDecimais(qtd * valor);
Joab Silveira

Joab Silveira

Responder

Post mais votado

18/06/2013

entendi ...

então ou vc reescreva a função Trunc ou personalize

vc pode utilizar um copy ate acha o decimalseperator para extrair a parte inteira deste numero

entende ???

Marco Salles

Marco Salles
Responder

Gostei + 1

Mais Posts

18/06/2013

Marco Salles

e qual deveria ser a repsota e o que esta dando ???
Responder

Gostei + 0

18/06/2013

Joab Silveira

Opa Marco, bom dia

como falei anteriormente, ao passar o valor 464 obtenho como resultado 463, o correto seria retornar o mesmo valor
a intenção dessa funcao eh retornar a parte inteira de um numero, se fosse 464.11 deve retornar 464 e por ai vai
se passo um numero inteiro sem casas decimais, deve me retornar o proprio numero

obs.: repare que eu faço a chamada apos um calculo entre duas variaveis, qtd * valor
onde qtd = 50 e valor = 9.28, qtd * valor = 464
se eu passar a constante 464 funciona, mas se eu passar o calculo nas duas variaveis acima nao da certo

ex.:

assim funciona
    variavel := TruncaCasasDecimais(464);


assim nao funciona
var
    qtd, valor: double;
begin
    qtd := 50;
    valor := 9.28;
    variavel := TruncaCasasDecimais(qtd * valor);
Responder

Gostei + 0

18/06/2013

Marco Salles

Entendi ..

Então joab silveira , o delphi geralmente trabalha com média

Ao fazer a multiplicação , apesar de ser um Inteiro matematicamente falando
para o delphi isto é quase um Inteiro ...Isto é Bit a bit , 464 é diferente de (50 X 0.98)
a razão destas diferença muitas das vezes ocorre pela escolha do tipo que utilizamos para estas
variáveis , que irá interferir futuramente quando se utiliza funçoes de maiores precissões

O Parãmetro da função Truc é Extended e vc esta utilizando um double que é mais restritivo

Portanto sugiro trocar o parâmetro para Extended



 var
    qtd, valor: Extended;


boa sorte

[]sds
Responder

Gostei + 0

18/06/2013

Joab Silveira

Opa Marco, realmente com extended funcionou

só tem um problema, no codigo original os valores vem de um banco de dados atraves de tfloatfields, que originalmente sao double
ate tentei colocar os valores dos tfloatfields em variaveis extended mas nao funcionou

ex.:
var
    qtd, valor: extended;
begin
    dataset.open;
    qtd := datasetqtd.value;
    valor := datasetvalor.value;
    variavelqualquer := TruncaCasaDecimais(qtd * valor);
Responder

Gostei + 0

18/06/2013

Joab Silveira

Opa Marco, realmente com extended funcionou

só tem um problema, no codigo original os valores vem de um banco de dados atraves de tfloatfields, que originalmente sao double
ate tentei colocar os valores dos tfloatfields em variaveis extended mas nao funcionou

ex.:
var
    qtd, valor: extended;
begin
    dataset.open;
    qtd := datasetqtd.value;
    valor := datasetvalor.value;
    variavelqualquer := TruncaCasaDecimais(qtd * valor);


obs.: mudei tambem o parametro na função TruncaCasaDecimais para extended, mas ainda assim nada
Responder

Gostei + 0

18/06/2013

Marco Salles

Então amigo , conversando em off com o Imex , testou com o tipo Cuureny



"Currency is a fixed-point data type that minimizes rounding errors in monetary calculations


e deu certo nos teste dele e meu

[]sds
Responder

Gostei + 0

19/06/2013

Joab Silveira

Opa Marco, agora funcionou com o currency
obrigado
Responder

Gostei + 0

26/09/2013

José

Como a duvida inicial foi sanada, estou finalizando este tópico.
Responder

Gostei + 0

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

Aceitar