Converter de dólares em centavos
On Fevereiro 14, 2021 by adminEstou tentando usar a função de arredondamento para ir de dólares para centavos, mas acredito que há algo sobre a função de arredondamento que tenho mal entendido, porque eu simplesmente não recebo os decimais comigo quando eu multiplico por 100 do flutuante para um int. Este é o código em questão
#include <stdio.h> #include <cs50.h> #include <math.h> int main(void) { int owed = 0; printf("Enter the owed amount: "); do { owed = GetFloat(); } while (owed < 0); owed = owed * 100.0; float owe = roundf(owed); owe = (int)owe;
Comentários
- i wasn ' Não sei como contorná-lo, estava usando round () não roundf () poderia me explicar por favor
Resposta
O principal problema é como você está armazenando o valor inicial recuperado. Você está chamando GetFloat()
e armazenando o resultado em owed
, uma variável do tipo int. GetFloat () retorna um número de ponto flutuante, que será implicitamente convertido como um int quando você tentar armazená-lo em devido. No processo, a parte do ponto decimal será truncada. Isso significa que você pode tentar armazenar 4,85 o dia todo e ele sempre armazenará como um inteiro 4.
Você deve armazenar o valor retornado de GetFloat () em um float var, não um int. Mais tarde, multiplique por 100 e arredonde e então armazene-o em um int, como você está tentando fazer.
Como uma nota lateral, as últimas linhas, enquanto funcionarão , não são terrivelmente limpos. Você cria um novo float para modificar o que deveria ser outro float e armazena o resultado e, na próxima linha, lança um float para um int e armazena o int de volta em um float. Faria mais sentido para arredondar o flutuador e armazená-lo de volta no mesmo flutuador, mas na próxima linha lançar o flutuador como um int e armazená-lo em um novo, int var. Ou, uma coisa mais limpa seria fazer tudo em uma linha: int change = roundf(dollars*100);
Se isso responder à sua pergunta, clique na marca de seleção para aceitar. Vamos continuar com a manutenção do fórum. 😉
Comentários
- Como eu poderia perder isso? Muito obrigado. Meu código acabou ficando péssimo depois de 3 horas mexendo na função round, não posso ' acreditar que poderia cometer um erro tão estúpido;)
- Posso ser muito exigente, mas você deve ficar longe de Casting implícito e sempre usar Casting explícito torna muito mais óbvio para o compilador, bem como para os futuros programadores, o que você está realmente tentando fazer. É um hábito muito bom entrar no início de sua programação, pois será uma segunda natureza e poupará muitas dores de cabeça (e criará um código muito melhor). mudança int = (int) (roundf (dólares * 100));
Deixe uma resposta