variaveis de valor igual considerando uma maior que a outra

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

variaveis de valor igual considerando uma maior que a outra

Mensagem por porter »

ola pessoal, tenho duas variaveis, cdesconto e desconto e os valores sao identicos, pelo debugador estou conferindo cada uma tem o valor de 3.58, mas na comparação na rotina abaixo, ele considera cdesconto > desconto, alguem ja teve esse problema, se teve, como resolver, obrigado.

Código: Selecionar todos

IF cdesconto > desconto <-- aqui ele considera cdesconto > que desconto, mas os valores sao identicos.
    LOOP
ELSE
    EXIT
ENDIF
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

variaveis de valor igual considerando uma maior que a outra

Mensagem por Jairo Maia »

Olá Porter,

Isso é porque em uma delas você está usando máscara, possivelmente a máscara "@E". Em outro post a cerca de 1 ano a outro colega já disse que a razão não sei, mas nesse caso você precisa alterar usando a função Round(). Veja:

Código: Selecionar todos

IF Round( cdesconto, 2 ) > Round( desconto, 2 )
    LOOP
ELSE
    EXIT
ENDIF
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

variaveis de valor igual considerando uma maior que a outra

Mensagem por Eolo »

Ponto flutuante: cdesconto contém 3.58 e desconto contém 3,580000001

Já apanhei com isso, não lembro quem me passou a dica aqui no Forum.

Passei a SEMPRE usar o STRZERO pra comparar dois números:
strzero(cdesconto,10,2)==strzero(desconto,10,2), comparando tamanho e conteúdo (com o ==)

Fim do problema.

Faça um teste: peça pra mostrar os dois números, com o máximo possível de casas decimais, tipo
? strzero(cdesconto,20,15)
? strzero(desconto,20,15)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

variaveis de valor igual considerando uma maior que a outra

Mensagem por porter »

obrigado Jairo e Eolo, deu certo, estranho que no Clipper, fiz esse teste e esse problema não aconteceu.
paiva_dbdc
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 12 Nov 2012 09:58
Localização: uberlandia mg

variaveis de valor igual considerando uma maior que a outra

Mensagem por paiva_dbdc »

if round(campo1,2) = round(campo2,2)

realmente é um saco.

NAo sei se o comando SET que define o n de casas acaba com isso.

Paiva
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

variaveis de valor igual considerando uma maior que a outra

Mensagem por rbonotto »

Também apanhei muito, minha solução foi colocar assim:

IF TRANSF(valor1,'999,999.99') # TRANSF(valor2,'999,999.99')
xxxx
ELSE
xxxx
END

abs
mixsistemas@gmail.com
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

variaveis de valor igual considerando uma maior que a outra

Mensagem por vagucs »

eu não sei, mas acho que isso não está relacionado apenas a dígitos decimais, eles também causam isto, mas nem sempre são eles os únicos causadores.

O clipper aloca números na memória as vezes, parece que com zeros a esquerda, ai depende do tamanho da variável.

É algo como se var=999999.99 depois jogo var=9.99 e ai quando comparo, é como se comparasse a alocação da memória toda.

É um saco isso.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

variaveis de valor igual considerando uma maior que a outra

Mensagem por JoséQuintas »

Anotei aqui.

Código: Selecionar todos

9.95 * ( 10 ^ 17 ) = 994999999999999700.0
tá multiplicando por 100000000000000000
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

variaveis de valor igual considerando uma maior que a outra

Mensagem por vagucs »

lembrei de uma coisa, o SET DECIMAL ajuda a tratar esse mal pela raiz. kkk. tomara né.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder