Bug sem sentido!

13 Respostas   502 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Tópico criado em: 14/07/2016 às 14:20 - Última modificação por Nunnu em 15/07/2016 às 19:35

Gente, to tentando fazer uns exercícios, e eu preciso fazer somas de "0.01" em uma variável "1.00". Pra isso to usando uma repetição.

O problema é que a soma não está somando certo, a soma é tipo assim: "1.01", "1.02", "1.03", "1.040000001", "1.059999998", e assim vai. Alguém sabe o que é isso?

O código pra quem quer testar:
Código: [Selecionar]
b = 1.00
while b != 25
p b += 0.01
end
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

MayLeone

  • Veterano
  • *
  • Posts: 513
  • Ouros: 1405
  • CRM
  • Medalhas Vencedor CRM Awards - Melhor Eventer Membros que se destacaram no Mega-Evento de Reconstrução
Resposta 1: 14/07/2016 às 14:30

Na primeira linha não seria b == 1.00 ?

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 2: 14/07/2016 às 14:51

@MayLeone
b é uma variável, então é só 1 "=", se por exemplo eu colocasse "if b == 1.00 não-sei-o-que-lá..." dai estaria certo, porque seria um condição.

Mesmo sabendo disso eu tentei, e deu um erro.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 3: 14/07/2016 às 15:25 - Última modificação por King Gerar em 30/07/2016 às 13:44

Assim rola?

Código: [Selecionar]
b = 1.00
while b != 25
  b += 0.01
  p b.round(2)
end

Essas linguagem são meio burrinhas em matemática kkk Com javascript acontece a mesma coisa.

Lycanimus

Resposta 4: 14/07/2016 às 15:30

Na verdade esta fórmula para somar números float não é certo fazer desse modo, ela acaba fazendo um pequeno arredondamento e da essa pequena diferença nos números, coisas de prog. mesmo, o que você pode fazer é somar números int e o resultado dividir por 100.0, ai creio que ficaria assim a sua fórmula:

Código: [Selecionar]
c = 0.0
b = 1.0
while b != 25
b += 1
p c = b / 100.0
end

Eu fiz um teste em outro programa e utilizei um for, mas o raciocínio acaba sendo o mesmo, o que eu fiz foi assim:

Código: [Selecionar]
float c = 1.0;

for (int b = 1; b < 25; b++){
  c = b / 100.0;
  println(c);
}

Espero que lhe ajude, abraços
Fazer mapas é uma arte, faça como se fosse o seu último.




Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 5: 14/07/2016 às 17:14

@King Gerar
Deu certo mesmo, esse round faz o que exatamente?

@Lycanimus
Entendi, mas no primeiro caso, dividir por 100 vai dar no mesmo? Se eu por exemplo usar essa fórmula para definir o ataque de algum monstro, ele vai ficar 0.25? Dai eu teria que deixar os números baseados nisso, tipo, o ataque dos monstros se era 50, 60, 25, vai ter que ficar 0.50, 0.60, 0.25, para balancear né?

Obrigado aos dois.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 6: 14/07/2016 às 17:18 - Última modificação por King Gerar em 30/07/2016 às 13:44

@King Gerar
Deu certo mesmo, esse round faz o que exatamente?
Pelo que entendi arredonda no número para um outro com os número de casas decimais especificado.

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 7: 14/07/2016 às 18:04

@King Gerar
Na verdade não deu certo, ele não para em 25, o loop continua, mas o arredondamento deu certo. Acho que o arredondamento só vale na impressão mesmo, o programa ignora nos códigos.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

Lima

Resposta 8: 14/07/2016 às 18:24

Faça:

Código: [Selecionar]
b = 1.00
while b < 25
  b += 0.01
  p b.round(2)
end

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 9: 14/07/2016 às 18:51

@Lima
Realmente deu certo, que estranho, mas obrigado! Vou continuar o código depois e vejo se não dá erro, se der eu edito aqui.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

felipefalcon

Resposta 10: 14/07/2016 às 19:20

@Lima
Realmente deu certo, que estranho, mas obrigado! Vou continuar o código depois e vejo se não dá erro, se der eu edito aqui.

É porque seu while tava -> while b != 25

Traduzindo                     -> enquanto b for diferente de 25

Se a variável deu 25.00000000000001 quando foi somando, já seria considerado diferente de 25, daí continuava XD
  

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 11: 14/07/2016 às 20:11 - Última modificação por King Gerar em 30/07/2016 às 13:44

Como disseram, tu tava errando o operador lógico. Se estiver tudo ok agora, só mudar o ícone do tópico
para resolvido para que a gente possa trancá-lo.

Lycanimus

Resposta 12: 14/07/2016 às 20:54 - Última modificação por Lycanimus em 14/07/2016 às 20:58

Espero que esteja tudo certo como o King falou, mas só completando o que me perguntou, no caso a fórmula feita é o valor dividido por 100, que faz a soma de 0.01 em 0.01 que você queria, por exemplo se a variável c = 0.0 e a b = 1.0 a soma é feita 1 / 100 para obter em c 0.01 a seguir no while é somado 1 em b, que fica 2 / 100 para obter em c 0.02 e assim por diante, o bom disso é que é obtido um valor fixo e não um arredondado pelo programa.

No caso para monstros, funciona da mesma forma, se o ataque do monstro é 50 por exemplo, a soma é feita 50 / 100 para obter 0.50 em c, como você fez, você apenas deve trabalhar com esses números para ajustar o balanceamento, de qualquer forma é um modo alternativo caso precise.

Espero que resolva, qualquer coisa é só falar, abraços!
Fazer mapas é uma arte, faça como se fosse o seu último.




Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 13: 14/07/2016 às 22:25 - Última modificação por Nunnu em 15/07/2016 às 19:35

@felipefalcon
Sim, justamente, por isso que eu queria arredondar, mas parece que arredondar não arredonda realmente, só serve de máscara para a impressão.

@King Gerar
Ok, vou continuar testando as possibilidades que me derem, quando eu resolver mudo o ícone para resolvido do tópico.

@Lycanimus
Agora entendi, bem inteligente, vou usar essa forma então. É que sempre quando acontece um problema é por causa de mim, dai nesse caso eu não via possibilidade de eu ter errado, fiz questão de fazer um tópico pra ver se tava fazendo merda, mas não, era o programa mesmo.

EDIT: Deu certo, meu objetivo era fazer um código que mostrava a raiz quadrada de um número com pelo menos 2 casas de precisão, um exercício do Raizen aqui da CRM, dei uma modificada, e inclui a parte da raiz quadrada. Ficou assim:

Código: [Selecionar]
a = 25
b = 1.00
while b * b  < a
  b += 0.01
  b * b
end
p b.round(2)

Obrigado a todos que me ajudaram, vou colocar o tópico como resolvido.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)