mnożenie float nie zaokrągla wyniku

0

Witam pisze program który liczbę zmienno przecinkowa zamienia na kod szesnastkowy. Ale mam pewien problem z obliczenie części ułamkowej na kod binarny. W internecie znalazłem kilka filmów które mi pomogły z tym zagadnieniem (bo wcześniej nie wiedziałem jak ugryź temat) i w tym filmiku był przykład 5.2 i przedstawienie liczby 0.2 w binarce to 0011 i tak w nieskończoność (odsyłam do filmu ) ale u mnie program jak mnoży 0.4 * 2.0 to mam jakieś 0.7999999 a nie 0.8 i tak dalej i w pewnym miejscy program się kończy bo otrzymuje 1 a nie powinien. Wynik poprawny to 00110011001100110011001 a u mnie jest 00110011001100110011.

do
    {
        decimal *= 2.0;
        std::cout.setf(std::ios::basefield , std::ios::fixed);
        std::cout <<  "decimal: " << decimal << std::endl;
        std::cout << "binarka: " <<  s_decimal_part << std::endl;
        if ( decimal > 1 )
        {
            s_decimal_part += std::to_string(1);
            decimal -= 1;
        }
        else if ( decimal > 0 && decimal < 1 )
            s_decimal_part += std::to_string(0);
        else if ( decimal == 1 || decimal == 0 )
        {
            if ( decimal == 1 )
                s_decimal_part += std::to_string(1);
            else if ( decimal == 0 )
                s_decimal_part += std::to_string(0);
            ++index;
        }
        std::cout << "binarka: " <<  s_decimal_part << std::endl;


    }
    while ( index != 1 ); 
0

ok Zrobiem precision(6) i troche poprawilo sprawe ale po pewnym czasie wszystko wrocilo do poprzedniego stany:
tu napisze kod i co wypisuje mi program:
kod:

 /* Program to converter floating number to hexadecimal code */
#include <iostream>
#include <cmath>
#include <iomanip>

void printfloat(float);

int main()
{
    float number = 0.0;
    int  how_many_step = 0;
    std::cin >> how_many_step;
    while (how_many_step > 0)
    {
        std::cin >> number;
        printfloat( number );
        --how_many_step;
    }
    return 0;
}

void printfloat(float n)
{
    std::string s_intiger_part;
    std::string s_decimal_part;
    std::string final_binary;
    int binary_intiger[8] {};
    int binary_decimal[8] {};
    float intiger_part = 0.0;                   //czesc calkowita
    float decimal_part = 0.0;                   //czesc ulamkowa
    decimal_part = std::modf( n , &intiger_part );
    std::cout <<  "czesc calkowita" << intiger_part << " czesc ulamkowa " << decimal_part << std::endl;
    int intiger_number = intiger_part;

    int index = 0;
    do
    {
        if( intiger_number % 2 == 0 )
        {
            std::cout << "mod 0" << std::endl;
            s_intiger_part += std::to_string(0);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
        if ( intiger_number % 2 == 1)
        {
            std::cout << "mod 1" << std::endl;
            s_intiger_part += std::to_string(1);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
    }
    while ( index != 1 );
    for ( int i = s_intiger_part.size() ; i >= 0 ; --i )
    {
        std::cout << "dana liczba: " << s_intiger_part[i] << std::endl;
        final_binary += s_intiger_part[i];
    }
    final_binary += ".";
    index = 0;
    std::cout << "liczba: " <<  intiger_part << " w binarnym to: " << s_intiger_part << std::endl;
    std::cout << "liczba: " <<  intiger_part << " w binarnym to: " << final_binary << std::endl;
    intiger_number = 0;
    float decimal = decimal_part;
    do
    {
        decimal *= 2.0;
        std::cout.setf(std::ios::basefield , std::ios::fixed );
        std::cout.precision(4);
        std::cout <<  "decimal: " << decimal << std::endl;
        std::cout << "binarka: " <<  s_decimal_part << std::endl;
        if ( decimal > 1 )
        {
            s_decimal_part += std::to_string(1);
            decimal -= 1;
        }
        else if ( decimal > 0 && decimal < 1 )
            s_decimal_part += std::to_string(0);
        else if ( decimal == 1 || decimal == 0 )
        {
            if ( decimal == 1 )
                s_decimal_part += std::to_string(1);
            else if ( decimal == 0 )
                s_decimal_part += std::to_string(0);
            ++index;
        }
        std::cout << "binarka: " <<  s_decimal_part << std::endl;


    }
    while ( index != 1 );
    std::cout << "czesc ulamkowa: " << decimal_part << " w binarnym to: " << s_decimal_part << std::endl;
}

a tu to co mi oblicza program:

 4
5.2
czesc calkowita5 czesc ulamkowa 0.2
mod 1
mod 0
mod 1
dana liczba: 
dana liczba: 1
dana liczba: 0
dana liczba: 1
liczba: 5 w binarnym to: 101
liczba: 5 w binarnym to: 101.
decimal: 0.4
binarka: 
binarka: 0
decimal: 0.8
binarka: 0
binarka: 00
decimal: 1.6
binarka: 00
binarka: 001
decimal: 1.2
binarka: 001
binarka: 0011
decimal: 0.4
binarka: 0011
binarka: 00110
decimal: 0.8
binarka: 00110
binarka: 001100
decimal: 1.6
binarka: 001100
binarka: 0011001
decimal: 1.2
binarka: 0011001
binarka: 00110011
decimal: 0.3999
binarka: 00110011
binarka: 001100110
decimal: 0.7998
binarka: 001100110
binarka: 0011001100
decimal: 1.6
binarka: 0011001100
binarka: 00110011001
decimal: 1.199
binarka: 00110011001
binarka: 001100110011
decimal: 0.3984
binarka: 001100110011
binarka: 0011001100110
decimal: 0.7969
binarka: 0011001100110
binarka: 00110011001100
decimal: 1.594
binarka: 00110011001100
binarka: 001100110011001
decimal: 1.188
binarka: 001100110011001
binarka: 0011001100110011
decimal: 0.375
binarka: 0011001100110011
binarka: 00110011001100110
decimal: 0.75
binarka: 00110011001100110
binarka: 001100110011001100
decimal: 1.5
binarka: 001100110011001100
binarka: 0011001100110011001
decimal: 1
binarka: 0011001100110011001
binarka: 00110011001100110011
czesc ulamkowa: 0.2 w binarnym to: 00110011001100110011
0

Czy ktoś jest mi to wstanie pomoc. Znalazłem w internecie ceil round ale tam trzeba wiedzieć ile jest miejsc po przecinku bo trzeba odpowiednio dzielić wynik. Spróbowałem dodawać te liczby ale tez nie działa, setprecision tez nie działa. Nie wiem kompletnie co zrobić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1