Umrechnung von Millisekunden

  • Hi ich hab ein kleines Problem:
    Ich arbeite im Moment an einem Taschenrechner mit sehr sehr vielen Funktionen (bis jetzt 1800 Zeilen Quellcode).
    Jetzt wollte ich noch diverse Zeitrechnungen hinzufügen (die mithilfe der BigNum.au3 rechnen).
    Dabei gibt es aber Probleme bei den Millisekunden. (Alle Einheiten werden immer erst in Minuten umgerechnet und dann in die Angegebene Einheit in die umgerechnet werden soll)

    Spoiler anzeigen
    [autoit]

    #include <Math.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    #include <GDIPlus.au3>
    #include <ButtonConstants.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>
    #include <String.au3>
    #include <EditConstants.au3>
    #include <GuiEdit.au3>
    #include <TabConstants.au3>
    #include <ComboConstants.au3>
    #include <IE.au3>
    #include <INet.au3>
    #include <File.au3>
    #include <BigNum.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hZeitGUI, $hZeitIn, $hZeitInput, $hZeitOut, $hZeitOutput, $hZUmrechnerBtn

    [/autoit] [autoit][/autoit] [autoit]

    _ZeitGUI()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ZeitGUI()
    Opt("GUIOnEventMode", 1)
    $bZeit = 1
    $hZeitGUI = GUICreate("Zeitrechner", 400, 200, -1, -1)
    GUISetOnEvent(-3, "_EndZeit", $hZeitGUI)
    $hTabZeit = GUICtrlCreateTab(0, 0, 400, 200)
    GUICtrlCreateTabItem("Zeitumrechnung")
    GUICtrlCreateLabel("=>", 185, 21, 28, 23)
    GUICtrlSetFont(-1, 20)
    $hZeitIn = GUICtrlCreateCombo("Millisekunden", 5, 25, 160, 20, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "Sekunden|Minuten|Stunden|Tage|Wochen|Jahre")
    $hZeitOut = GUICtrlCreateCombo("Millisekunden", 233, 25, 160, 20, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "Sekunden|Minuten|Stunden|Tage|Wochen|Jahre")
    $hZeitInput = GUICtrlCreateInput("", 5, 55, 160, 20)
    $hZeitOutput = GUICtrlCreateInput("", 233, 55, 160, 20, $ES_READONLY)
    $hZUmrechnerBtn = GUICtrlCreateButton("Umrechnen", 150, 85, 100, 25)
    GUICtrlSetOnEvent(-1, "_ZeitBerechnung")
    GUICtrlCreateTabItem("Datumsdifferenz Berechnung")
    GUISetState()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ZeitBerechnung()
    Switch @GUI_CtrlId
    Case $hZUmrechnerBtn
    $iZInput = GUICtrlRead($hZeitInput)
    Switch GUICtrlRead($hZeitIn)
    Case "Millisekunden"
    $iZMin = _BigNum_Div(_BigNum_Div($iZInput, 1000), 60)
    Case "Sekunden"
    $iZMin = _BigNum_Div($iZInput, 60)
    Case "Minuten"
    $iZMin = $iZInput
    Case "Stunden"
    $iZMin = _BigNum_Mul($iZInput, 60)
    Case "Tage"
    $iZMin = _BigNum_Mul(_BigNum_Mul($iZInput, 24), 60)
    Case "Wochen"
    $iZMin = _BigNum_Mul(_BigNum_Mul(_BigNum_Mul($iZInput, 7), 24), 60)
    Case "Jahre"
    $iZMin = _BigNum_Mul(_BigNum_Mul(_BigNum_Mul(_BigNum_Mul($iZInput, 52), 7), 24), 60)
    EndSwitch
    ConsoleWrite("@@DEBUG $iZMin = " & $iZMin & @CRLF)
    Switch GUICtrlRead($hZeitOut)
    Case "Millisekunden"
    $iZResult = _BigNum_Mul(_BigNum_Mul($iZMin, 60), 1000)
    Case "Sekunden"
    $iZResult = _BigNum_Mul($iZMin, 60)
    Case "Minuten"
    $iZResult = $iZMin
    Case "Stunden"
    $iZResult = _BigNum_Div($iZMin, 60)
    Case "Tage"
    $iZResult = _BigNum_Div(_BigNum_Div($iZMin, 60), 24)
    Case "Wochen"
    $iZResult = _BigNum_Div(_BigNum_Div(_BigNum_Div($iZMin, 60), 24), 7)
    Case "Jahre"
    $iZResult = _BigNum_Div(_BigNum_Div(_BigNum_Div(_BigNum_Div($iZMin, 60), 24), 7), 52)
    EndSwitch
    GUICtrlSetData($hZeitOutput, $iZResult)
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _EndZeit()
    $bZeit = 0
    GUIDelete($hZeitGUI)
    Exit
    EndFunc

    [/autoit]


    Wenn ich mit dem Zeiten Umrechner 1 Millisekunde umrechne in Millisekunden müsste ja eigentlich soviel herauskommen wie man davor eingegeben hat. Es kommen aber nur 96% des zuvor angegebenen Werts heraus. :?: Ich hab das jetzt so um die 10 mal selbst nachgerechnet und eigentlich müsste es funktionieren. Tut es aber nicht.
    Hat vllt. jemand ne Lösung dafür?

    PS: Ja viele von den Includes sind unnötig die werden aber im Moment vom Hauptskript benötigt. (Dieser Skriptteil soll wenn er funktioniert dann in die HauptGUI integriert werden.)

    Edit: Kann es sein das die Fehler durch Fehler in der BigNum.au3 entstehen.
    Wenn man z.B. 1000 Ms in Minuten und wieder in Ms umrechnet:
    1000 / 1000 / 60 = 1/60 = 0,01666666666 (periodisch)
    Doch da gibt die BigNum.au3 0.16 aus wodurch diese Fehler entstehen.

    Edit2: Problem ist gelöst indem ich alles erstmal in Ms umrechne statt in Min.

    2 Mal editiert, zuletzt von Molaynox (1. Juli 2011 um 12:50)

  • Hi

    Du musst bei _BigNum_Div angeben, wieviele Dezimalstellen du haben willst, ansonsten wird gerundet

    [autoit]

    #include "BigNum.au3"

    [/autoit][autoit][/autoit][autoit]

    $MS = 1234
    ConsoleWrite($MS & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Result = _BigNum_Div($MS, 1000, 20)
    ConsoleWrite($Result & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Result = _BigNum_Div($Result, 60, 20)
    ConsoleWrite($Result & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Result = _BigNum_Mul($Result, 60)
    ConsoleWrite($Result & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Result = _BigNum_Mul($Result, 1000)
    ConsoleWrite($Result & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Result = _BigNum_Round($Result, 0)
    ConsoleWrite("! " & $Result & " = " & $MS & @CRLF)

    [/autoit]
  • Ah Ok wusste ich noch garnicht das es das als Parameter gibt ^^.
    Habs ja wie oben geschrieben jetzt anders gelöst.
    Aber Trotzdem Danke.
    Gut zu wissen mit dem Parameter zum Runden.