trennen der Vor- und Nachkommastellen eines double Wertes



  • Hallo, 😎

    gibt es eine Funktion die einen double Wert bzw. einen long Wert, in Vor- und Nachkommastelle trennen kann? oder geht es nur ueber strings?



  • Die Vorkomma-Stellen kannst du über ceil() erhalten, die Nachkomma-Stellen sind die Differenz zwischen Zahl und VK-Anteil:

    double zahl = ...;
    
    double VK = ceil(zahl);
    double NK = zahl-VK;
    


  • Hmm ceil? Nee floor ... ceil gibt normal bei bsw. 5.43 6 zurück.

    const double number(5.43);
    unsigned int pre_dot(static_cast<unsigned int>(std::floor(number)));
    double post_dot(number - pre_dot);
    

    ...



  • (D)Evil schrieb:

    Hmm ceil? Nee floor ... ceil gibt normal bei bsw. 5.43 6 zurück.

    Ups - stimmt.



  • Die passende Funktion wäre modf.

    #include <math.h>
    double x = 1.234;
    
    double i;
    double f = modf(x, &i);
    // jetzt ist in i der integer teil und in f die kommastellen
    

    p.S.: modf funktioniert dann auch mit negativen Zahlen richtig 😉



  • super vielen dank am euch, das hat mich einiges weiter gebracht.
    Allerdings bin ich nun an einen neuen Knackpunkt gestossen.

    Wenn ich eine Zahl 12.3456 zu der Basis 2 umwandeln moechte, gehe ich momentan so vor:

    - trenne 12 von 0.3456
    - wandel 12 um :>
    - wandel 0.3456 um.

    Das funktioniert bis jetzt ganz gut. Die nächste Hürde ist beide Resultate wieder zusammen zufuegen ohne das er mir die Nachkommastelle kuerzt oder aufrundet.

    (Fuer den Nachkommeteil verwende ich float.)

    Wenn ich nun 12 in 12.0 konvertiere und mit 0.3456 addiere wird die NAchkommastelle gekuerzt. Das moechte ich nicht. Desweiteren faengt er an zu runden wenn ich mit setprecision()- arbeite Oo.

    Hat wer noch eine Idee dazu? Oder vlt. etwas tieferes Hintergrundwissen?

    mfg



  • Brüche...



  • Im Threadtitel schreibst du "double" und dann schreibst du "(Fuer den Nachkommeteil verwende ich float.)".

    double hat eine Präzision von ca. 15 Stellen, während float nur ca. 6-7 Stellen hat (insgesamt, also Vor- und Nachkommastellen gerechnet).
    Also nimm am besten durchwegs "double".
    Aber wofür benötigst du diese Umrechnung (insbesondere für die Basis 2)?



  • hmm, was meinst du mit "brueche" ?

    also ich arbeite an einer Funktion die eine Dezimalzahl in eine Zahl eines anderes Zahlensystems konvertiert (halt zur Basis n).

    Das klappt mit ganzen Zahlen gut. Und bei den rationalen Zahlen klappt nur das Zusammenfuegen von der getrennten Vorkomma und nachkomma stelle nicht.

    Ich spring gerade zwischen double und float hin und her um zu sehen ob es daran liegen koennte allerdings scheint es nicht so zu sein. Wie gesagt, in der Variable fuer Vorkommastellen steht der richtige Wert und in der Variable der Nachkommastelle steht 0."der richtige Wert" . Nur beide zusammen als ERgebnis kann ich nicht ausgeben *fuuu* ^^



  • Ich verstehe nicht so ganz was du willst.
    Du kannst Zahlen nicht in ein anderes System konvertieren, du kannst sie nur in einem anderen System darstellen. Intern rechnet die CPU immer mit Base 2, und zur Ausgabe wird die Zahl dann als Base 10 dargestellt.

    Also was genau willst du machen? Zahlen als Base N ausgeben? Oder willst du die Base N Darstellung irgendwie speichern? Wenn ja kannst du kein double dafür verwenden, nimm ein char/short/int Array oder etwas ähnlihes.


Anmelden zum Antworten