comparação errada de valores

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

comparação errada de valores

Mensagem por porter »

Olá pessoal, não entendo porque esse cálculo retorna .T., estou somando soma_parcelas + desconto e comparando com soma_, pelo debug
verifiquei os valores e a soma é exatamente igual.
Alguém já teve esse problema, como contornar ?


soma_parcelas = 1041.85
desconto = 31.54
soma_ = 1073.39

IF ( VAL(STR(soma_parcelas,12,2)) + VAL(STR(desconto,12,2)) < VAL(STR(soma_,12,2)) )
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

comparação errada de valores

Mensagem por asimoes »

Porter,

Tenta isso:

Código: Selecionar todos

    IF ( VAL(hb_NtoS(soma_parcelas+desconto)) < VAL(hb_NtoS(soma_)) )
        Alert("Menor")
     ENDIF
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

comparação errada de valores

Mensagem por asimoes »

Pode tentar isso também:

Código: Selecionar todos

 ? Val(hb_NtoS(VAL(hb_NtoS(soma_parcelas)) + VAL(hb_NtoS(desconto)))) > VAL(hb_NtoS(soma_)) 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

comparação errada de valores

Mensagem por wmanesco »

Sinceramente não lembro de str já vai arredondar, mas tenta usar o round caso os outros exemplos não funcionem..

Código: Selecionar todos

IF ( Round( VAL(STR(soma_parcelas,12,2)), 2 ) + Round( VAL(STR(desconto,12,2)), 2) < Round( VAL(STR(soma_,12,2)) ,2) )
Já vi problemas como esse e round resolveu
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

comparação errada de valores

Mensagem por rubens »

Eu uso Round em todos os cálculos de divisão e multiplicação...
Mas percebi também que esses erros geralmente acontecem quando o tamanho das variáveis (a máscara) são diferentes. Tipo um cálculo onde a máscara usada ou declaração foi 99999.99 e a outra foi 999999999.99 pode dar errado...
Mas depois de muito quebrar a cabeça resolvi adotar o round...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

comparação errada de valores

Mensagem por porter »

Bom dia pessoal, agora deu certo, obrigado a todos.

esse deu certo, mas a minha preocupação é com as casas decimais que não é informada

Código: Selecionar todos

IF ( VAL(hb_NtoS(soma_parcelas+desconto)) < VAL(hb_NtoS(soma_)) )
esse não deu certo:

Código: Selecionar todos

IF ( Round( VAL(STR(soma_parcelas,12,2)), 2 ) + Round( VAL(STR(desconto,12,2)), 2) < Round( VAL(STR(soma_,12,2)) ,2) )
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

comparação errada de valores

Mensagem por JoséQuintas »

Deixa mais simples, baseado até no seu anterior mesmo.

Código: Selecionar todos

IF Str( soma parcelas + desconto, 15, 2 ) < Str( soma_, 15, 2 )
Explicação:
A diferença ocorre ao trabalhar com numéricos com ponto flutuante.
Então como string, não tem a diferença de conversão.

Nota:
Essa diferença seria algo em torno de 0.00000000000000001

Convém lembrar que seu cálculo também poderia dar diferença de centavos.
Por exemplo, 1.000 em 3 parcelas de 333.33, vai totalizar 999.99
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/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

comparação errada de valores

Mensagem por porter »

Obrigado JoseQuintas pela explicação, essa forma da certo e é mais simples.
Responder