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

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, 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/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
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