Ganzzahlen, Fix() rechnet falsch
-
Freitag, 7. Dezember 2012 10:19
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
- Bearbeitet Florian.Reiter Freitag, 7. Dezember 2012 10:26
- Bearbeitet Florian.Reiter Freitag, 7. Dezember 2012 10:27
Alle Antworten
-
Freitag, 7. Dezember 2012 13:55
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 FunctionHabe 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:45Besitzer
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
'***************************************************** '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:09Mein 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:39Besitzer
'***************************************************** '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
Hallo Helfer,
Hab das Problem anders Gelöst, die Minuten werden nun in Folgendes Format
umgewandelt 'TT' Tage, 'hh,hh' StdPrivate 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
- Bearbeitet Florian.Reiter Dienstag, 11. Dezember 2012 09:56
- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Owner Dienstag, 11. Dezember 2012 10:24
-
Dienstag, 11. Dezember 2012 09:56Besitzer
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.

