Получить десятичную часть числа [дубликата]

На этот вопрос уже есть ответ:

Математика с плавающей точкой нарушена? 28 ответов

Попытка получить целую и десятичную часть числа в две переменные. Что я пробовал:

#include <iostream>
int main(){
    float n,m; int k; std::cin >> n;
    k = n;
    m = n - k;

Попытался преобразовать число с плавающей точкой в int и получил компилятором предупреждение о том, что число может быть неправильным, проверено, действительно неверно и не может получить ожидаемые результаты. Поиск по этому, не мог найти другого обходного пути, кроме использованияfloor().

Мой действительный код:

int main() {
    float n; cin >> n;
    int nfloor = n;
    cout << nfloor << "\n";
    float nfloat = n - nfloor; int nfloatfloor;
    cout << nfloat << "\n";
    do {
        nfloat *= 10;
        nfloatfloor = nfloat;
        cout << nfloat << "\n" << nfloatfloor << "\n";
    } while (nfloat > nfloatfloor);
}

Полученные результаты

Input: 12.34
Output :
12
0.34
3.4
3
34
34
340
340
3400
3400
34000
34000
340000
340000
3.4e+06
3400001
3.4e+07
34000016

Вычитание двух чисел с плавающей запятой возвращает неверное значение. Поиск выполнен по этому вопросу, но ответы были на высоком уровне, который я не мог понять.

Мой действительный код:

int main() {
    float n; cin >> n;
    float nfloor = floor(n);
    cout << nfloor << "\n";
    float nfloat = n - nfloor; float nfloatfloor;
    cout << nfloat << "\n";
    do {
        nfloat *= 10;
        nfloatfloor = floor(nfloat);
        cout << nfloat << "\n" << nfloatfloor << "\n";
    } while (nfloat > nfloatfloor);
}

Полученные результаты

Input: 12.34
Output:
12
0.34
3.4
3
34
34 //Run should stop here because of the while loop bit it doesn't, funny thing is it gives me different results sometimes, last time it gave me 35 and 34
340
340
3400
3400
34000
34000
340000
340000
3.4e+06
3.4e+06
3.4e+07
3.4e+07

@ Slava Посмотрите на вывод прямо над этим предложением, компилятор напечатал 34 и 34, повторяющийся ответ показывает, что количество мест равно 34.0000000000000004 или что-то в этом роде, и, как я прокомментировал выше, код должен был остановиться. на самом деле пытается сделать это сравнить число с плавающей точкой и число int, если (float> int) код должен продолжаться, а если нет, он должен остановиться, есть ли какое-то решение? @hnefatl Я попробовал ваш ответ, и компилятор просто зависает:

int main() {
    float n2, whole, fractional, fractional2, whole2; cin >> n2;
    int denominator = 1;
    fractional = modf(n2, &whole);
    do {
        fractional *= 10;
        fractional2 = modf(fractional, &whole2);
        denominator *= 10;
    } while (fractional > fractional2);
    if (denominator > 1)
        denominator /= 10;
    cout << denominator;
}

Ответы на вопрос(2)

Ваш ответ на вопрос