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: 1058
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: 2822
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 1058
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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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