Как в числе double избавиться от точки си
Нужно преобразовывать число типа double в инт, для начала пытаюсь его домножить, чтобы избавиться от точки. Например 3.14 должно стать 314. Код работает корректно не для всех чисел. На 3.14 все работает правильно, но если ввести, допустим 5.2356, то программа выдает 45235599999999981749174009856.000000. Есть ли какой-нибудь альтернативный способ?
int main()
{
double num;
scanf("%lf", &num);
while (fmod(num,10)!=0){
num=num*10;
}
num = num/10;
printf("%lf", num);
}
Ответы (1 шт):
Проблема в том что десятичные дроби не отображаются точно в машинные вещественные числа. Чтобы решить задачу надо отказаться от использования float/double.
Программа читает число в виде строки, подсчитывает число цифр после десятичной точки, убирает десятичную точку, печатает десятичную дробь.
Два момента: memmove чтобы подвинуть хвост строки на символ влево и нотация %.*d с аргументами zeros, 0 в printf чтобы напечатать нужное число нулей:
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
if (scanf("%99s", s) != 1) {
return 1;
}
int zeros = 0;
char *p = strchr(s, '.');
if (p != NULL) {
zeros = strlen(p) - 1;
memmove(p, p + 1, zeros + 1);
}
printf("%s/1%.*d\n", s, zeros, 0);
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror as_fraction.c $ echo 3.14 | ./a.out 314/100 $ echo 5.2356 | ./a.out 52356/10000 $ echo 314 | ./a.out 314/1