Answered Ganzzahlen, Fix() rechnet falsch

  • Freitag, 7. Dezember 2012 10:19
     
      Enthält Code

    Ich habe ein Problem mit der Funktion Fix(), sie rechnet immer Falsch,

    Ich progammiere eine Funktion die mir aus einer Zahl (Minuten) eine Formatierte Zeit zurückgibt, dabei benötige ich die Funktion Fix, diese mach leider einen Fehler, ich habe das ganze Szenario in Excel nachgespielt wo es richtig ist.

    Kann mir jemand Helfen

    Private Function sFormatnTime(nMinuteinsert)
    Dim nHourWith,  nDaysWith, nMinuteWith 'genaue Werte mit Komma
    Dim nHourWithout, nMinuteWithout, nDaysWithout 'genaue Werte ohne Komma (nicht gerundet, Komma "abgeschnitten"
    Dim sMinute, sHour
    Dim nTest, nTest1
    nMinuteinsert = 110
    nHourWith = nMinuteinsert / 60
    nHourWithout= Fix(nHourWith )
    nMinuteWith = nHourWith - nHourWithout 
    'nMinuteWithout = nMinuteWith * 60
    nMinuteWith = nMinuteWith * 60
    nMinuteWithout= Fix(nMinuteWith)
    Call WriteTest(CStr(nMinuteWithout)  ,".txt")
    If nHourWithout > 24 Then
    	nDays = nHourWithout / 24 
    	nDays = Fix(nDays)
    	sFormatnTime = CStr(nDays) & "T, " & CStr(nHourWithout ) & ": " & CStr(nMinuteWithout) 
    Else
    	sFormatnTime = CStr(nHourWithout ) & ":" & CStr(nMinuteWithout) 
    End If 
    End Function

    nWithout sollte 50 ergeben


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter



Alle Antworten

  • Freitag, 7. Dezember 2012 13:55
     
      Enthält Code

    Hi Florian,

    ich denke mal nMinuteWithout soll 50 sein. Leider hast du auch nicht genau angegeben was genau der Fehler ist. Meine Vermutung wäre das du 49 heraus bekommst, wenn ja hast du einfache einen Rundungsfehler durch die 0,833333 Periode.

    Probiere es mal mit Modulo.

    Dürfte ungefähr so aussehen:

    nMinuteWithout= nMinuteinsert mod 60 (= 50)
    nHourWithout= Fix( nMinuteinsert/60 ) (= 1)
    
    Call WriteTest(CStr(nMinuteWithout)  ,".txt")
    
    If nHourWithout > 24 Then
            nHourWithout = nHourWithout mod 24 
            nDays = Fix( nHourWithout/24)
            sFormatnTime = CStr(nDays) & "T, " & CStr(nHourWithout ) & ": " & CStr(nMinuteWithout) 
    Else
            sFormatnTime = CStr(nHourWithout ) & ":" & CStr(nMinuteWithout) 
    End If 
    End Function

    Habe jetzt bei mir Zuhause aber keine VB6 IDE installiert mit der ich das Ausprobieren könnte.

    MFG

    Björn

  • Freitag, 7. Dezember 2012 14:20
     
     

    Hallo Florian,

    Du solltest Dir angewöhnen, die Datentypen nicht als Kommentar hinter die Deklaration zu schreiben, sondern die Datentypen richtig definieren.

    So hast Du zunächst immer Variant, was sich durch Zuweisungen wieder ändert. So lässt sich schwer vorhersehen, was dabei raus kommt.

    Z.B. nMinuteinsert wird eine Ganzzahl zugewiesen, dann wird durch eine Ganzzahl dividiert; ergibt normalerweise wieder eine Ganzzahl (auch wenn Du dem Variablennamen was anderes wünscht); ein Fix darauf ändert nicht viel.


    Olaf Helper

    Blog Xing

  • Montag, 10. Dezember 2012 12:29
     
     

    Hat sich schon erledigt, vielen Dank


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

  • Montag, 10. Dezember 2012 14:45
    Besitzer
     
     

    Hat sich schon erledigt, vielen Dank

    Hallo Florian.Reiter,

    Es wäre schön und hilfreich, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Danke und Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

  • Dienstag, 11. Dezember 2012 08:48
     
      Enthält Code
    '*****************************************************
    'Kommastellen einer Zahl entfernen muss kleiner als 100 Sein
    Private Function nFixFlorian(nWith)
    If InStr(nWith, ",") Then
     nFixFlorian= Fix(nWith)
    Else
     nFixFlorian = nWith
    End If
    End Function


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

  • Dienstag, 11. Dezember 2012 09:09
     
     
    Mein Problem ist Generell das ich eine Anzahl von Minuten (z.B. 3001) in ein Format anzeigen will das ähnlich TT: hh: mm ist 

    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

  • Dienstag, 11. Dezember 2012 09:39
    Besitzer
     
      Enthält Code
    '*****************************************************
    'Kommastellen einer Zahl entfernen muss kleiner als 100 Sein
    Private Function nFixFlorian(nWith)
    If InStr(nWith, ",") Then
     nFixFlorian= Fix(nWith)
    Else
     nFixFlorian = nWith
    End If
    End Function


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter

    Hallo Florian.Reiter,

    Schau Dir mal folgenden Artikel an. Vielleicht kann er Dir weiterhelfen:

    Strip/Remove Text From a String

    Hast Du verstanden was Olaf Dir geschrieben hat? „Du solltest Dir angewöhnen, …, sondern die Datentypen richtig definieren.“

    … welcher Datentyp hat nWith aus Deiner Zeile: Private Function nFixFlorian(nWith) ?

    … welcher Datentyp bringt Deine Funktion zurück? Private Function nFixFlorian(nWith) As ???

    Visual Basic 6 String Functions

    Grüße,

    Robert



    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

  • Dienstag, 11. Dezember 2012 09:47
     
     

    Hast Du verstanden was Olaf Dir geschrieben hat? „Du solltest Dir angewöhnen, …, sondern die Datentypen richtig definieren.“

    … welcher Datentyp hat nWith aus Deiner Zeile: Private Function nFixFlorian(nWith) ?

    Hallo Robert,

    Florian hat noch ein anderes Post mit ähnlichem Thema im ASP (?) Forum: Rechenproblem 0.016666666666700000000000000000 * 60, Rechnet falsch

    Er nutzt wohl VBScript, wo man keine Typen bei der Deklaration angeben kann.


    Olaf Helper

    Blog Xing

  • Dienstag, 11. Dezember 2012 09:54
     
     Beantwortet Enthält Code

    Hallo Helfer,

    Hab das Problem anders Gelöst, die Minuten werden nun in Folgendes Format
    umgewandelt 'TT' Tage, 'hh,hh' Std

    Private Function sFormatnTime(nMinuteinsert)
    Dim nHour,  nDays, nMinute 'genaue Werte mit Komma
    Dim nDaysWithout 'genaue Werte ohne Komma (nicht gerundet, Komma "abgeschnitten"
    nHour = nMinuteinsert / 60
    nHour = Round(nHour,2)
    If nHour > 24 Then
    	nDays = nHour / 24 
    	nDays = Fix(nDays)
    	nHour = nHour - nDays * 24 'Tage von den Stunden Wegrechnten
    	sFormatnTime = nDays & " Tage, " & nHour & " Std" 
    Else
    	sFormatnTime = nHour & " Std" 
    End If 
    
    End Function
    '*****************************************************
    'Kommastellen einer Zahl entfernen 
    Private Function nFixFlorian(nWith)
    If InStr(nWith, ".") > 0 Then
    	nFixFlorian= Fix(nWith)
    End If
    If InStr(nWith, ",") > 0 Then
    	nFixFlorian= Fix(nWith)
    End If
    nFixFlorian = nWith
    End Function


    Bitte klärt mich über falsche Fachbegriffe auf Beste Grüße Florian Reiter


  • Dienstag, 11. Dezember 2012 09:56
    Besitzer
     
     

    Er nutzt wohl VBScript, wo man keine Typen bei der Deklaration angeben kann.

    Hallo Olaf,

    A…ok für den Hinweis, dachte es ist VB6 weil das Forum hier für VB6 geeignet ist.

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.