DateDiff bestimmter Monat innerhalb eines Zeitraums

  • Und wieder einmal recht herzlichen Dank! :)

    Nur ein klein wenig Anpassung und es tut was es soll.

    Zitat von BugFix

    Dazu gibt es fertige Funktionen:

    • $tMin = _GUICtrlMonthCal_GetMonthRangeMin($idMonthCal)
    • $tMax = _GUICtrlMonthCal_GetMonthRangeMax($idMonthCal)

    MfG BugFix

    Diese Variante scheint leider bei dem verwendeten Kalender nicht zu funktionieren oder ich hab es vergeigt :-/

  • Nun ist das Berechnungsprogramm schon beinahe 4000 AutoIt-Zeilen lang und weiß noch immer zu überraschen... :D
    Beim durchrechnen verschiedener Beispielfälle ist mir etwas sonderbares aufgefallen.

    Und zwar: Beträge im Hunderter, und Zehnerbereich mit den ungeraden Nachkommastellen XXX,33 / XX,33 und XXX,55 / XX,55 werden beim teilen durch 2 bzw. auf 50% gerechnet, falsch kaufmännisch gerundet.

    Beispiele:
    500,33 € * 0,5 = 250,16 € anstatt wie es richtig wäre 250,17 € oder
    55,55 € * 0,5 = 27,77 € anstatt 27,78 €

    Nehme ich aber stattdessen Beträge über dem Hunderterbereich z.B. 5000,33 € * 0,5 wird mir folgerichtig 2500,17 € ausgegeben.
    Beim Zehnerbereich verhält es sich ebenfalls korrekt.

    Hat jemand ne Ahnung woran das liegt? Ein Bug?


    Und wenn ich schon mal schreibe, kann ich die Beträge auch mit 1.000 er Trennpunkt darstellen?

    Momentan werden sie dank bernd670 mit GUICtrlSetData($hHandle, StringFormat("%.2f €", Number($szValue))) im Format 1000.00 € ausgegeben/umgewandelt. Vermutlich wird es durch die Scriptsprache vorgegebene Formatierung für den Euro nicht möglich sein, zumindest nicht ohne das es Probleme beim Rechnen gibt.

    Einmal editiert, zuletzt von xbl38spezial (17. Juni 2015 um 20:20)

    • Offizieller Beitrag

    Und wenn ich schon mal schreibe, kann ich die Beträge auch mit 1.000 er Trennpunkt darstellen?

    Boah - das Syntaxhighlighting ist ja noch immer abartig.


    500,33 € * 0,5 = 250,16 € anstatt wie es richtig wäre 250,17 € oder

    Verwende Round(Expression, 2) zum kaufmännischen Runden.

  • Hat jemand ne Ahnung woran das liegt? Ein Bug?

    Ja - der binäre Rundungsfehler.
    Ist von AutoIt unabhängig und tritt bei jeder Programmiersprache mit Gleitkommazahlen auf.
    Konkret für dein Beispiel siehst du den Grund für das Rundungsverhalten hier:

    AutoIt
    ConsoleWrite(StringFormat("%.16f\n", 500.33*0.5))
    ConsoleWrite(StringFormat("%.16f\n", 5000.33*0.5))


    Daher wird in (vernünftiger) Software welche mit Geldbeträgen umgeht auf keinen Fall eine Gleitkommazahl zur Speicherung der Werte verwendet sondern Festkommazahlen.
    AutoIt hat so einen Typ zwar nicht aber da Festkommazahlen sich intern nicht anders als Integer verhalten, kann man stattdessen Integer verwenden.

    Heißt konkret: Rechne statt in € alles in Cent (und achte zwischendurch darauf, dass nicht implizit mal in Float gewandelt wird) und lasse dir erst bei der Ausgabe daraus €-Beträge machen.
    Konkret für dein Beispiel:

    AutoIt
    ConsoleWrite(Ceiling(50033/2)/100 & @CRLF)
    ConsoleWrite(Ceiling(500033/2)/100 & @CRLF)