Kommazahlen im StringGrid? (war: StringGrid)



  • So wirklich weiß ich jetzt nicht was ich damit anfangen soll!



  • Sonnenschein84 schrieb:

    Aber es hat doch bisher mit oben angegebenen Quellcode auch funktioniert, nur eben nicht, wenn eine Kommazahl herauskam, dann berechnet er mehr Stunden. Zum beispiel bei 13,2 Stunden verteilt er 14 h!

    So wie ich es verstehe, willst Du eine Zahl (Stundenanzahl dividiert durch Anzahl der Monatstage) zufällig auf die einzelnen Tage des jeweiligen Monats aufteilen (ungleichmäßig, d. h. als Beispiel mal ein Tag kann auch Null Stunden haben:
    http://www.c-plusplus.net/forum/viewtopic.php?t=54453).
    Bisher hat es mit Integerzahlen funktioniert, mit Floats aber nicht. Dein Problem liegt jetzt also an die Nachkommazahl.

    Wenn ich das richtig verstanden habe, dann: Prüfe am Anfang, ob die Stundenzahl Nachkommazahl hat oder nicht, wenn nicht dann machst Du wie bisher, wenn ja, dann extrahierst Du die Vorkommazahl und machst damit auch wie bisher. die Nachkommazahl addierst Du dann einfach "zufällig" zu irgendeinem Tag. (die Verteilung ist ja ungleichmäßig, deshalb spielt es keine Rolle, zu welchem Tag Du diese Nachkommazahl addierst)

    Dein Beispiel: 13,2
    die 13 nehmen und verteilen. Dann die 0,2 zu irgendeinem Tag addieren.

    Ansonsten gibt es noch die andere Variante mit Umwandlung der Stunden in Minuten und dann umgekehrt.

    Ich hoffe, ich habe da kein "Müll" geschrieben.
    xy



  • Also ich finde du hast erstmal mein Problem verstanden. Ich hab auch verstanden wie du das meinst, nur weiß ich nicht wie ich etwas überprüfe ob es eine Nachkommastelle hat!



  • Du prüfst, ob die Zahl überhaupt ein Komma hat, indem Du die Position ermittelst.

    if (FloatToStr(f).Pos(",") > 0)
        ShowMessage("ja");
      else
        ShowMessage("nein");
    

    wobei f die Zahl ist.
    Vielleicht geht es auch anders (eleganter).
    xy



  • Es geht ja nicht drum wie elegant es ist. Bin dir auf jeden Fall total dankbar. Allerdings hab ich jetzt noch das Problem, wie ich Nachkommastelle und das davor ermittel!
    Nachkomma vielleicht so?

    double nachkomma = FloatToStr(zuwend_h).Pos(",");
    


  • int iVor = StrToInt(FloatToStr(f).SubString(1, FloatToStr(f).Pos(',') - 1));
    ShowMessage(iVor);
    int iNach = StrToInt(FloatToStr(f).SubString(FloatToStr(f).Pos(',') + 1, FloatToStr(f).Length()));
    ShowMessage(iNach);
    

    Probiere es damit aus. (ungetestet)
    xy



  • if(int(f)-f) ShowMessage("ja");
    else ShowMessage("nein");
    

    Dein Beispiel: 13,2
    die 13 nehmen und verteilen. Dann die 0,2 zu irgendeinem Tag addieren.

    Die Verteilung der Gesamtstunden ist so allerdings ziemlich unausgewogen.(Jeweils immer nur an einem Tag wird ne angebrochene Stunde dazugezählt.)
    Zähl doch einfach in kleinerern Schritten 0,1 (nicht Integer)

    float *verteilung = new float[tage];
    
    verteilung[random(tage)]+=.1;
    


  • und nicht vergessen.

    zuwend_h*10
    


  • Sonnenschein84 schrieb:

    Allerdings hab ich jetzt noch das Problem, wie ich Nachkommastelle und das davor ermittel!

    Hab gegoogelt und folgendes gefunden:

    int integer = int(f); //Vorkommazahl
      ShowMessage(integer);
      float decimal = f - int(f); //Nachkommazahl (mit 0,)
      ShowMessage(decimal);
    

    Sieht klasse aus. Und das von franko ist auch Klasse! (zum Prüfen, ob eine Zahl Nachkommazahl hat oder nicht)

    franko schrieb:

    if(int(f)-f) ShowMessage("ja");
    else ShowMessage("nein");
    

    Ich hoffe, Du kannst damit was anfangen.
    xy



  • Ihr seit ganz klasse. Ich bin euch total dankbar. Ich bin total im Streß und soll das jetzt fix runter programmieren bzw. eben nur das Problem da heraus nehmen. Ich füge das dann morgen ein. Falls ich noch ein Problem habe, wäre ich froh wenn ich auf euch zurück greifen könnte. Ich möchte euch aber nochmal ganz sehr danken. Ihr habt mir echt geholfen!



  • wie bekomme ich aus der Kommazahl, eine Zahl die nach dem Komma nur 2 Stellen hat?



  • neu = ((int) (alt * 100)) / 100;
    

    oder
    VCL-Referenz zu RoundTo



  • funktioniert irgendwie nicht wirklich!



  • Sehr präzise Beschreibung.
    Was funktioniert nicht?



  • Dasd schrieb:

    neu = ((int) (alt * 100)) / 100;
    

    oder
    VCL-Referenz zu RoundTo

    Damit bekommt man die Vorkommazahl: 13,12345 -> 13
    Und RoundTo ist in meiner BCB-Hilfe nicht zu finden (?)

    Sonnenschein84 schrieb:

    wie bekomme ich aus der Kommazahl, eine Zahl die nach dem Komma nur 2 Stellen hat?

    Die hier gefundene Funktion tut es für Dich:

    double Round(double Zahl, int Stellen)
    {
        return floor(Zahl * pow( 10, Stellen) + 0.5) * pow(10, -Stellen);
    }
    

    Und

    #include <math.h>
    

    nicht vergessen.
    xy



  • @xy danke dir, aber ich hatte es bereits so gelöst:

    AnsiString neu= FormatFloat("0.0",verteilung[tag++]);
                StringGrid1->Cells[i+1][2] = neu;
    

    das ging auch!



  • xy schrieb:

    Damit bekommt man die Vorkommazahl: 13,12345 -> 13
    Und RoundTo ist in meiner BCB-Hilfe nicht zu finden (?)

    Falsch:

    13,12345 * 100 = 1312,345 -> int -> 1312 / 100 = 13,12.
    Hat schon im klassischen C funktioniert.

    Und RoundTo gibt's in der VCL-Referenz.



  • Ist ja nun gelöst das Problem! Ich hab das mit dem RoundTo bei mir auch nicht gefunden!



  • Dasd schrieb:

    float alt=13.123456;
      float neu = ((int) (alt * 100)) / 100;
      ShowMessage(neu);
    

    Hast Du es denn in BCB ausprobiert?



  • Ok, hast Recht:

    float neu = (float) ((int) (alt * 100)) / 100;
    

    Hatte nicht bedacht, dass in C++ der /-Operator automatisch castet wenn's sein muss.


Anmelden zum Antworten