Как в числе 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 шт):

Автор решения: Stanislav Volodarskiy

Проблема в том что десятичные дроби не отображаются точно в машинные вещественные числа. Чтобы решить задачу надо отказаться от использования 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
→ Ссылка