[BEE 1040 - MEDIA 3] - Conceito de arredondamento de ponto flutuante
Hello Devs,
Esta será uma publicação muito longa, caso queria a resposta logo de cara do porque você esta errando esse exercício, assim como eu estava, eis sua resposta: Seu arredondamento esta errado, agora caso queira assim como eu entender onde estávamos errando, pega seu café, se ajeita na sua cadeira gamer, e vem comigo.
Sinceramente, eu nunca vi um exercício com uma lógica tão simples dar tanto trabalho, se liga nisso, e olha desde quando estou tentando resolver esse problema:
Pois é, eu sei eu sei... Ficar até as 02:26 da madrugada escrevendo código não é coisa de gente normal, bem-vindo ao clube.
Mas qual era o exercício mesmo? Eis o dito cujo:
Bom, agora podemos por a mão na massa. Eu gosto de resolver essas atividades de console no Visual Studio Code (https://code.visualstudio.com/download), caso queiram me avisem que eu faço um tutorial de como usar o C# no VS Code.
Voltando o assunto, lá estava eu codificando, finalizo a lógica e faço meu primeiro submit (enviar).
Nossa, me senti um hacker, olha isso, mandei um for, uns if, uns else if.
Que decepção...
Lesson Number One:
Não complique as coisas, elas já são complicadas demais, na programação menos é mais, infelizmente acabei auto infligindo me, pois eu sempre digo que código bom, é código legível, e o meu não estava tão lá essas coisas, dado a simplicidade do problema proposto, quanto mais simples for, mais simples a resposta tem que ser. Eis o que deveria ter feito:
Agora sim, simples, elegante, resolve o assunto dentro do escopo do exercício.
Lesson Number Two:
Meu maior erro, e o que me fez ficar preso nessa atividade, realizei vários teste, mas NUNCA FIZ UM DEBUG, e isso me custou caro, muito caro, sabe por que? porque dinheiro a gente ganha mais, um objeto perdido a gente compra outro, agora o tempo desperdiçado, esse não volta jamais. Quase tudo é recuperável, o tempo não.
O próprio beecrowd tenta te ajudar, quando ele percebe algumas coisas erradas, reparem:
Dito isso, eu deveria ter dado mais atenção aos erros apontado, e logo perceberia, o que estava fazendo de errado: Arredondamento de número com ponto flutuante
No C# existem diversas formas de se arredondar um número, mas vamos voltar um pouco no tempo, lá na quinta série, ou 1900 e bolinha, quando a professora de matemática me disse que para arredondar um número, basta verificar a última casa decimal.
SE for igual ou maior que 5, arredonda pra cima, SE NÃO, basta remover o decimal.
Exemplo:
- 5,6 -> 6
- 5,4 -> 5
- 70,58 -> 70,6
- 23,43 -> 23,4
-70,589 -> 70,59 -> 70,6 -> 71
- 23,434 -> 23,43 -> 23,4 -> 23
Como fora dito antes, existem diversas forma de fazer isso no C#, mas dentro do escopo solicitado no exercício o arredondamento deve ser feito, levando em consideração a regra a cima, e ainda mantendo o valor de ponto flutuante com 1 casa decimal.
Método A:
($"{valor:F1}") ou valor.toString("F1")
Onde:
valor -> É o número decimal no qual eu quero arredondar.
F -> Formatação aplicada no arredondamento.
1 -> Número de casas decimais.
Obs: Note que o tipo de formatação pode ser Sensitive Case para ALGUNS CASOS.
Obs 2: Para usar " : ", você deve trabalhar com o método de interpolação.
Exemplo Prático:
Método B:
Math.Round(valor, 1)
Onde:
Math -> É a classe
Round -> Método da classe
valor -> Número decimal a ser arredondado
1 -> Número de casas decimais.
Exemplo prático:
Mas caso você tente implementar apenas uma das duas soluções, devido a forma com que o beecrowd faz a entrada de dados, aplicando regras de arredondamento ele acusará erro:
Math.Round
Caso tente implementar apenas com a formatação por interpolação, eis o mesmo erro:
Foi então que comecei a debugar meu código, e entendi que alguns valores o beecrowd não permitia passar nos teste, utilizei a plataforma: https://www.udebug.com
Dessa forma utilizei as duas implementação em conjunto, o que permitiu remover os erros de arredondamento, e que os testes passassem:
Caso tenha lido até aqui, o meu muito obrigado e um verso de consolação.
"Batatinha quando nasce,
se esparrama pelo chão,
Codifique sem parar,
até cair suas mãos."
Qualquer coisa estou sempre por aqui, Fui !!
André Filipe @andresantosUma coisa é certa: você está pronto para escrever livros.
A mensagem mais importante da publicação é "eu deveria ter dado mais atenção aos erros apontados". De fato, o debug é necessário e aprender com os erros gera produtividade. Eu faço inúmeros testes antes de subir o código ao beecrowd. Desde o "Hello World", não sei mais o que são erros de apresentação nem muitos erros de compilação. Evitei outros erros também porque li sobre os problemas que os demais colegas publicaram no discord e aqui no fórum. Executar o código após incluir novas linhas também é muito bom para quem está aprendendo, assim como o teste de mesa: papel e caneta na mão!
Lucas Ferreira @lksferreiraMeus olhos estão suando, obrigado por ter lido, deu um baita trabalhão escreve. <3
Em resposta alksferreira⬆:Letícia de Sousa Silva @leticia_sousaCara, sério mesmo!
Muito obrigada.. eu fiquei um dia inteirinho tentando resolver essa questão sozinha, mas não tava batendo o resultado e era exatamente por isso. Apliquei os dois métodos que vc ensinou no meu programa e voilà! OBRIGADA!!!!!!!!
Obs sua forma de ensinar foi muito top e divertida !
Lucas Ferreira @lksferreiraHello @leticia_sousa
Ficou muito feliz em ler seu feedback, obrigado de coração.
Esse problema acontece porque esses métodos apenas arredondam o valores de forma "superficial", isso significa que por de baixo dos panos, as casas decimais depois do valor arredondado ainda estão armazenados na memória da variável, e quando realizamos uma operação com essas variáveis ele leva em consideração esse "valor oculto embutido", e por isso estávamos com problema.
Existem sobrecargas do método
Math.Roundque resolve esse problema, e existe também o métodoMath.Truncateque elimina verdadeiramente o valor depois de arredondado.Se eu pegar outro exercício com o mesmo problema, vou abordar esse assunto de novo nesse ponto de vista. Eu só não coloquei isso esse artigo porque tem um limite no tamanho da publicação.
Obrigaduu, qualquer coisa estamos sempre por aqui.
Em resposta alksferreira⬆:Larissa Leal @LariLealSeus posts aqui são sempre bem redondinhos. Recentemente tive um problema de arredondamento e voltei aqui para resolver minha situação.
Você tem algum blog ou página em algum lugar? Gostaria de te acompanhar
Lucas Ferreira @lksferreiraTenhu naum := , depois dessa talvez eu até faça um.
Larissa Leal @LariLealFaz sim, compartilhar conhecimento é sempre bem vindo!