PDA

Ver Versão Completa : Conta que não bate o resultado!



Belini
23/03/2016, 16:43
Estou com um script onde preciso atualizar uma variável somando 0.35 duas vezes e depois no final tirar o número que inicial que foi sendo atualizado, pela lógica se somei 0.35 ao número 2 vezes e retirei este número no final então deveria sobrar 0.70 mas por algum motivo a conta não bate se este valor inicial for de 4 para cima que aí dá dízima ao invés dos 0.70 como devia, estou postando o script para análise e aí quem sabe alguém consiga me apontar o erro!


;$valor = 1; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
;$valor = 2; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
$valor = 3; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
;$valor = 4; valor que será atualizado com 0,35 duas vezes ==> (acima de 3 o resultado dá dízima)
$subtrair = $valor; valor que será retirado no resultado final

For $i = 1 To 2
$valor += 0.35; aumenta 0,35 duas vezes
Next

MsgBox(4096, "VALORES", "Valor total = " & $valor & @crlf & "Valor inicial: " & $subtrair);valores para fazer a conta

$resultado = number($valor) - number($subtrair); da soma tira o valor inicial (teria que dar 0.7)
MsgBox(4096, "RESULTADO", $resultado); acima de 4 da dízima ao invés de 0.7

mutleey
23/03/2016, 17:27
não entendi muito bem, mais olha se é isso.


;$valor = 1; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
;$valor = 2; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
;~ $valor = 3; valor que será atualizado com 0,35 duas vezes ==> (dá o resultado certo)
$valor = 4; valor que será atualizado com 0,35 duas vezes ==> (acima de 3 o resultado dá dízima)
$subtrair = $valor; valor que será retirado no resultado final

For $i = 1 To 2
$valor += 0.35; aumenta 0,35 duas vezes
Next

MsgBox(4096, "VALORES", "Valor total = " & $valor & @crlf & "Valor inicial: " & $subtrair);valores para fazer a conta

$resultado = number($valor) - number($subtrair); da soma tira o valor inicial (teria que dar 0.7)
MsgBox(4096, "RESULTADO", StringFormat("%.1f", StringFormat("%f", $resultado))); acima de 4 da dízima ao invés de 0.7

Belini
23/03/2016, 17:35
mutleey desta forma funcionou mas o que exatamente o StringFormat("%f" faz? Vc tem alguma ideia do que faz dar dízima quando subtrai sendo que não está sendo dividido nem multiplicado?

mutleey
23/03/2016, 17:40
mutleey desta forma funcionou mas o que exatamente o StringFormat("%f" faz? Vc tem alguma ideia do que faz dar dízima quando subtrai sendo que não está sendo dividido nem multiplicado?

StringFormat("%.1f" -> formata o resultado com casas "decimais", como vc precisava do resultado "0.7" no caso um algarismo depois do ponto o parametro é "%.1f", se precisar de 2 algarismos depois do ponto "%.2f" e assim sucessivamente.

Editado:
desculpe vc perguntou do "%f", este converte a variavel para um ponto flutuante...
https://pt.wikipedia.org/wiki/Ponto_flutuante

Belini
09/01/2017, 11:48
Estou novamente quebrando a cabeça com uma conta que não bate o resultado mas só acontece se eu somar um valor com a variável depois diminuir um outro valor nela mas se eu diminuir e depois somar dá certo, não achei lógica neste primeiro resultado!


teste_1()
teste_2()

Func teste_1()
Local $variavel_1 = 0.40; A variável tem o valor = 0.40
Local $descontar = 0.10; A variável tem o valor = 0.10
Local $variavel_2 = 1.30; A variável tem o valor = 1.30

$variavel_1 += 1; passa o valor para 1.40
$variavel_1 -= $descontar; passa o valor para 1.30

MsgBox(4096, "TESTE", "As duas variáveis são iguais mas a comparação dá que NÃO SÃO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

If Number($variavel_1) = Number($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
EndFunc ;==>teste_1

Func teste_2()
Local $variavel_1 = 0.40; A variável tem o valor = 0.40
Local $descontar = 0.10; A variável tem o valor = 0.10
Local $variavel_2 = 1.30; A variável tem o valor = 1.30

$variavel_1 -= $descontar; passa o valor para 0.30 <================== MUDEI APENAS A ORDEM
$variavel_1 += 1; passa o valor para 1.30 <=========================== MUDEI APENAS A ORDEM

MsgBox(4096, "TESTE", "As duas variáveis são iguais e a comparação dá que SÃO MESMO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

If Number($variavel_1) = Number($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
EndFunc ;==>teste_2

Fábio iGames
09/01/2017, 13:46
Estou novamente quebrando a cabeça com uma conta que não bate o resultado mas só acontece se eu somar um valor com a variável depois diminuir um outro valor nela mas se eu diminuir e depois somar dá certo, não achei lógica neste primeiro resultado!


teste_1()

Func teste_1()
Local $variavel_1 = 0.40; A variável tem o valor = 0.40
Local $descontar = 0.10; A variável tem o valor = 0.10
Local $variavel_2 = 1.30; A variável tem o valor = 1.30

$variavel_1 += 1; passa o valor para 1.40
$variavel_1 -= $descontar; passa o valor para 1.30

MsgBox(4096, "TESTE", "As duas variáveis são iguais mas a comparação dá que NÃO SÃO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

If Number($variavel_1) = Number($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
EndFunc ;==>teste_1

Func teste_2()
Local $variavel_1 = 0.40; A variável tem o valor = 0.40
Local $descontar = 0.10; A variável tem o valor = 0.10
Local $variavel_2 = 1.30; A variável tem o valor = 1.30

$variavel_1 -= $descontar; passa o valor para 0.30 <================== MUDEI APENAS A ORDEM
$variavel_1 += 1; passa o valor para 1.30 <=========================== MUDEI APENAS A ORDEM

MsgBox(4096, "TESTE", "As duas variáveis são iguais e a comparação dá que SÃO MESMO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

If Number($variavel_1) = Number($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
EndFunc ;==>teste_2


Belini é bem simples de entender isso amigão.

Você está usando números fracionados, ou seja , flutuantes que não são inteiros.

Então é só usar uma das funções: Floor , Round ou Ceiling e pronto:

Exemplo:


teste_1()

Func teste_1()
Local $variavel_1 = 0.40 ; A variável tem o valor = 0.40
Local $descontar = 0.10 ; A variável tem o valor = 0.10
Local $variavel_2 = 1.30 ; A variável tem o valor = 1.30

$variavel_1 += 1 ; Passa o valor para 1.40
$variavel_1 -= $descontar ; passa o valor para 1.30

;~ MsgBox(4096, "TESTE", "As duas variáveis são iguais mas a comparação dá que NÃO SÃO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

#Region ==> As Três Funções funcionam, mas a mais Lógica para se usar nesse seu caso é a Ceiling().
; Floor ==> Retorna um número arredondado para baixo para o inteiro mais próximo.
; Round ==> Retorna um número arredondado para o próximo inteiro.
; Ceiling ==> Retorna um número arredondado para um número especificado de casas decimais.
#EndRegion

;~ If Floor($variavel_1) == Floor($variavel_2) Then
;~ If Round($variavel_1) == Round($variavel_2) Then
If Ceiling($variavel_1) == Ceiling($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
EndFunc ;==>teste_1



Você pode usar também a Função IsFloat() , que verifica se o valor de uma variável ou expressão tem um componente fracionário, ou seja , se é um Número Flutuante.

Exemplo com IsFloat():


teste_1()

Func teste_1()
Local $variavel_1 = 0.40 ; A variável tem o valor = 0.40
Local $descontar = 0.10 ; A variável tem o valor = 0.10
Local $variavel_2 = 1.30 ; A variável tem o valor = 1.30

#Region
;; ==> Teste com essas duas variáveis:
;; ==> Comente uma despois a outra e vejao resutado.
Local $variavel_1 = 1.1 ; 1 Teste Número inteiro
Local $variavel_2 = 1 ; 1 Teste Número inteiro.
#EndRegion

$variavel_1 += 1 ; Passa o valor para 1.40
$variavel_1 -= $descontar ; passa o valor para 1.30

;~ MsgBox(4096, "TESTE", "As duas variáveis são iguais mas a comparação dá que NÃO SÃO!" & @CRLF & @CRLF & Number($variavel_1) & @CRLF & Number($variavel_2))

#Region ==> As Três Funções funcionam, mas a mais Lógica para se usar nesse seu caso é a Ceiling().
; Floor ==> Retorna um número arredondado para baixo para o inteiro mais próximo.
; Round ==> Retorna um número arredondado para o próximo inteiro.
; Ceiling ==> Retorna um número arredondado para um número especificado de casas decimais.
#EndRegion

; Dica: Você ainda pode usar a Função IsFloat()
; Ela verifica se o valor de uma variável ou expressão tem um componente fracionário, ou seja , se é um Número Flutuante.
; Retorno da Função IsFloat()
; 1 = Número é Fraciondo.
; 0 = Número não é Fracionado.
;
If IsFloat($variavel_1) And IsFloat($variavel_2) Then ; Se as Duas Variáveis Forem Números Fracionados (Flutuantes) , Então...
MsgBox(4096, "OK ==>" & IsFloat($variavel_1) & "=" & IsFloat($variavel_2), "As Duas Variáveis São Números Flutuantes (Fracionados).")
;~ If Floor($variavel_1) == Floor($variavel_2) Then
;~ If Round($variavel_1) == Round($variavel_2) Then
If Ceiling($variavel_1) == Ceiling($variavel_2) Then
MsgBox(4096, "OK", "A duas variáveis SÃO iguais a 1.30")
Else
MsgBox(4096, "ERRO", "A duas variáveis NÃO SÃO iguais 1.30")
EndIf
Else ; Se não Forem então...
If Not IsFloat($variavel_1) And Not IsFloat($variavel_2) Then ; Se as Duas Não Forem Números Fracionados então...
MsgBox(4096, "OK ==>" & IsFloat($variavel_1) & "=" & IsFloat($variavel_2), "As Duas Variáveis Não São Números Flutuantes (Fracionados).")
Else ; Se uma das duas Forem...
If Not IsFloat($variavel_1) Then MsgBox(4096, "OK ==>" & IsFloat($variavel_1) & "=" & IsFloat($variavel_2), "Variável $variavel_1 Não é um Número Flutuante (Fracionado).")
If Not IsFloat($variavel_2) Then MsgBox(4096, "OK ==>" & IsFloat($variavel_1) & "=" & IsFloat($variavel_2), "Variável $variavel_2 Não é um Número Flutuante (Fracionado).")
EndIf
EndIf
EndFunc ;==>teste_1


Outra coisa , o sinal de = em AutoIt se refere a receber algo.

O sinal de == se refere a comparação.

Nem é preciso usar a Função Number usa direto uma das três: Floor , Round ou Ceiling

Entendeu a Lógica ai amigão. :cool:

Belini
09/01/2017, 14:41
Obrigado Fábio iGames agora entendi e vou preferir usar o == pois assim não terei que determinar se é para 32 ou 64 bits e nem se é número flutuante!

pedrowarlock
09/01/2017, 21:44
Como assim definir o que é 64 e o que é 32? Essas funções tem algo haver com isso?

Belini
10/01/2017, 08:42
É que no outro fórum me deram a dica pra resolver usando o number() com os parâmetros 1 ou 2 que determina se o número é 32 ou 64 bits pois o default desta função é zero que não diferencia um do outro!

pedrowarlock
10/01/2017, 10:17
Aproveitando o tópico para tirar uma dúvida sobre autoit

Porque no windows 10 eu consigo definir pastas anteriores usando ".." e no windows XP não funciona? O script fica na pasta "C:/arcade/taito" e os jogos ficam em "C:/arcade/jogos/taito"

$executa=ShellExecute("typex_loader.exe" , $EMULADOR_EXE, "..\jogos\taito\","open",@SW_SHOW)


Eu tive que fazer isso aqui para resolver o problema.

$executa=ShellExecute("typex_loader.exe" , $EMULADOR_EXE, StringLeft(@ScriptDir,2) & "\arcade\jogos\taito\","open",@SW_SHOW)

Belini
10/01/2017, 17:51
Porque no windows 10 eu consigo definir pastas anteriores usando ".." e no windows XP não funciona?

pedrowarlock não sei te dizer pois não testei nenhum script no windows 10 ainda!