paulo1205
(usa Ubuntu)
Enviado em 19/03/2017 - 11:27h
Com
scanf(), você não tem como limitar a precisão na hora de ler -- o máximo que pode fazer é limitar a quantidade total de caracteres que formam o número. Essa quantidade pode ser difícil de prever, especialmente quando se está interagindo com um usuário.
Para fazer o que você quer, você terá de fazer o trabalho por conta própria.
Um caminho possível é com preprocessamento: ler como string e fazer manipulações sobre ela antes de convertê-la em número. Seria o meio de ter o maior controle possível, mas possivelmente seria muito trabalhoso.
Outra possibilidade é com posprocessamento, no qual você converte o número diretamente, e depois faz contas com ele a fim de desprezar eventuais partes indesejadas. Segue um exemplo tosco de como poderia ser feito com posprocessamento.
float num, num_proc;
scanf("%f", &num);
num_proc=copysignf(floorf(fabsf(num)*10.f)/10.f, num);
Note porém que se você quiser eliminar problemas de exatidão do número na hora de ser expresso como decimal, nenhuma dessas abordagens deve funcionar. Nossos computadores trabalham com representação binária dos números de ponto flutuante, e a conversão de frações decimais para binário frequentemente produz dízimas, o que implica que uma representação exata é impossível.
Sabendo dessa impossibilidade, talvez você tenha de limitar o tanto de informação que você entrega ao usuário, a fim de que ele não perceba a imprecisão. Contudo, essa decisão depende do contexto: pode haver casos em que o usuário requeira o máximo de precisão possível, e em tais casos você provavelmente não deveria limitar o número de casas decimais apenas para esconder o efeito de truncamento das dízimas.