erro ao truncar

Delphi

17/06/2013

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

Curtidas 1

Melhor post

Marco Salles

Marco Salles

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 ???
GOSTEI 1

Mais Respostas

Marco Salles

Marco Salles

17/06/2013

e qual deveria ser a repsota e o que esta dando ???
GOSTEI 0
Joab Silveira

Joab Silveira

17/06/2013

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);
GOSTEI 0
Marco Salles

Marco Salles

17/06/2013

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
GOSTEI 0
Joab Silveira

Joab Silveira

17/06/2013

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);
GOSTEI 0
Joab Silveira

Joab Silveira

17/06/2013

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
GOSTEI 0
Marco Salles

Marco Salles

17/06/2013

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
GOSTEI 0
Joab Silveira

Joab Silveira

17/06/2013

Opa Marco, agora funcionou com o currency
obrigado
GOSTEI 0
José

José

17/06/2013

Como a duvida inicial foi sanada, estou finalizando este tópico.
GOSTEI 0
POSTAR