Runden von ,5 Werten klappt nicht

Hallo
habe mal wieder ein Problem entdeckt, was nervt.

Ob der Fehler bei mir liegt oder an VB keine Ahnung.
Jedenfalls habe ich Zahlenwerte in einem String, welche ich auf eine bestimmte Anzahl Nachkommastellen runden möchte.
Der Zahlenwert ist mit .-Trennung also zB 120.5
Die Stringvariable heisst Vorkomma und wird auf K Stellen gerundet und dann wieder in einen String verwandelt.

Vorkomma = LTrim$(Str(Round((Val(Vorkomma)), K)))

Warum rundet er exakte .5 werte ab und nicht auf.
Oder manchmal tut ers auch aufrunden.
Ist da ein Logikfehler oder wie behebt man dies.

Mfg Werner

Hi,

das liegt an der VB eigenen VAL Funktion. Die ist nicht i.O.

Ein Lösungsbeispiel findest Du hier:

http://www.vbarchiv.net/archiv/tipp_1321.html

Gruß Andreas

Hallo Werner,

Warum rundet er exakte .5 werte ab und nicht auf.
Oder manchmal tut ers auch aufrunden.
Ist da ein Logikfehler oder wie behebt man dies.

wo soll da ein Fehler sein?

Bis .5 wird abgerundet, darüber aufgerundet. Das ist doch richtig.

Gruß, Rainer

Dashilft mir beides nicht richtig
Hallo
irgendwie sind beide Antworten nicht so recht hilfreich.

Ich habe keine 1000er Trennzeichen, es geht ganz einfach ums runden von Zahlen. Oder muß man im Val(Stringwert) mit Komma arbeiten???

Das ,5000 aufgerundet wird sollte ja wohl klar sein, es wird bis ,4999 abgerundet. Oder sehe ich da was falsch???

Ich glaube ich setze die Strings erst in Longs um und tue sie dann wieder in den String, dann sollte das klappen.

Mfg Werner

Hallo Werner,

Das ,5000 aufgerundet wird sollte ja wohl klar sein, es wird
bis ,4999 abgerundet. Oder sehe ich da was falsch???

ja, ,50000 wird abgerundet. Nicht nur im Programm, mit dem Kugelschreiber auf dem Papier auch.

Gruß, Rainer

Hilfe
Hallo
nun ich hab die Passage im Buch gefunden.
Hast recht, wenn es genau .5 heisst wird abgerundet, aber es heisst da auch entgegen der mathematischen Annahme!!!.
Da wir mathematisch denken oder das brauchen, muß ich bei genau .5 immer aufrunden können!

Wie kriege ich das hin, wenn ich unterschiedlich runden möchte (mal nach 2 Stellen, mal nach 5 Stellen) und genau dann da prüfen muß, ob an der Stelle .5 steht.

Beispiel: 120.5 soll 121 werden bei Runden nach 1Stelle
120.465 soll 120.47 werden bei Runden nach 2 Stellen

Da muß sich doch schon mal jmd Gedanken drüber gemacht haben, oder?

Mfg Werner

Moin Rainer,
seit wann wird denn beim Auftauchen einer Zahl >=5 in der Rundstelle die Zahl abgerundet?
Siehe DIN 1333
http://www.tu-chemnitz.de/physik/OFGF/pgp/ppp/Runden…

Gruß.Timo

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin,

Wie wärs hiermit?

Public Function runden(ByVal zahl As Double, stelle As Integer)
If CDbl(zahl - Round(zahl, stelle)) = CDbl(5 \* 10 ^ -(stelle + 1)) Then
 runden = Round(zahl + 1.1 \* 10 ^ -(stelle + 1), stelle)
Else
 runden = Round(zahl, stelle)
End If
End Function

Gruß.Timo

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Timo,

seit wann wird denn beim Auftauchen einer Zahl >=5 in der
Rundstelle die Zahl abgerundet?
Siehe DIN 1333
http://www.tu-chemnitz.de/physik/OFGF/pgp/ppp/Runden…

OK, ich habe mich für 5 Minuten in die Ecke gestellt und mich geschämt. ;-( Reicht das?
Ich war mir sicher, das anders gelernt zu haben.

Gruß, Rainer

Hallo Werner,

nun ich hab die Passage im Buch gefunden.
Hast recht, wenn es genau .5 heisst wird abgerundet, aber es
heisst da auch entgegen der mathematischen Annahme!!!.

ich habe inzwischen auch in ein Buch gesehen, die Regel, die da steht ist noch um einiges komplizierter. Dann habe ich mit VB experimentiert und das verhält sich genau so. :wink:

Bei X.5 wird auf eine gerade Zahl gerundet. 1,5 und 2,5 liefern gerundet also beide 2. :wink:

Da wir mathematisch denken oder das brauchen, muß ich bei
genau .5 immer aufrunden können!

Wie kriege ich das hin, wenn ich unterschiedlich runden möchte
(mal nach 2 Stellen, mal nach 5 Stellen) und genau dann da
prüfen muß, ob an der Stelle .5 steht.

Beispiel: 120.5 soll 121 werden bei Runden nach 1Stelle
120.465 soll 120.47 werden bei Runden nach 2 Stellen

Da muß sich doch schon mal jmd Gedanken drüber gemacht haben,
oder?

Bestimmt, aber da hilft wohl selbst machen am schnellsten.

Z.B.:

Private Function Rund(Wert, NK)
 Dim G, N
 Wert = Wert \* 10 ^ NK
 G = Int(Wert)
 N = Wert - G + 1
 Rund = (G + (Round(N, 0)) - 1) / 10 ^ NK
End Function

Aufrufen mit ‚a = Rund ( a , n )‘

… das geht sicher noch eleganter, aber so geht’s auch. :wink:

Gruß, Rainer
PS. Trotzdem habe ich in der Schule gelernt, daß bei .5 abgerundet wird, aber das ist inzwischen falsch. Das ist wohl schon zu lang her. :wink:

Hallo, Werner!

Ganz altes Problem, hatte ich vor kurzem auch, allerdings unter Excel. Runden ist imho immer noch Glückssache…

Schaust Du am besten hier: http://www.donkarl.com/ in der FAQ unter 2.1 Runden (oder „runden“ in der Suche eingeben).

Warum rundet er exakte .5 werte ab und nicht auf.
Oder manchmal tut ers auch aufrunden.
Ist da ein Logikfehler oder wie behebt man dies.

Irgend jemand hatte Visionen, nachdem er schlechtes Zeug geraucht hat. Diese „Logik“ entzieht sich meiner immer noch. Also: Nicht wundern, umgehen.

Gruß, Manfred

Hallo Manfred,

Ganz altes Problem, hatte ich vor kurzem auch, allerdings
unter Excel. Runden ist imho immer noch Glückssache…

nicht ganz. Ich habs mir vorhin angesehen und auch mein altes Tabellenbuch aufgeschlagen, passt genau. :wink:

Schaust Du am besten hier:
http://www.donkarl.com/ in der FAQ unter 2.1
Runden (oder „runden“ in der Suche eingeben).

Warum rundet er exakte .5 werte ab und nicht auf.
Oder manchmal tut ers auch aufrunden.
Ist da ein Logikfehler oder wie behebt man dies.

Irgend jemand hatte Visionen, nachdem er schlechtes Zeug
geraucht hat. Diese „Logik“ entzieht sich meiner immer noch.
Also: Nicht wundern, umgehen.

Ne, ne. :wink: Ist schon richtig. In der TGL 0- 1333 (DDR) stand’s genau so. Die Nummer besagt, daß das damals mit der DIN 1333 identisch war.
Die aktuelle DIN 1333 konnte ich min Netz nicht finden, ich denke, die sieht immer noch so aus.

Die Regel:

1 - 4 wird abgerundet.
6 - 9 wird aufgerundet.

5 wird aufgerundet, wenn auf weiteren Stellen eine Zahl größer 0 folgt, die nicht durch Runden entstanden ist.

Folgt auf die letzte anzugebende Zahl eine 5, die durch runden entstanden ist, dann wird abgerundet, wenn die 5 durch aufrunden entstanden ist, aufgerundet, wenn die 5 durch abrunden entstanden ist.

Ist die letzte Stelle genau 5, wird auf eine gerade Zahl gerundet.

1,5 und 2,5 ist nach der regel gerundet also beides 2. :wink:

Genau so rechnen die Microsoft Programme, ist alles völlig richtig.

Gruß, Rainer

Hi, Rainer!

Ne, ne. :wink: Ist schon richtig. In der TGL 0- 1333 (DDR)
stand’s genau so. Die Nummer besagt, daß das damals mit der
DIN 1333 identisch war.
Ist die letzte Stelle genau 5, wird auf eine gerade Zahl
gerundet.

1,5 und 2,5 ist nach der regel gerundet also beides 2. :wink:

Genau so rechnen die Microsoft Programme, ist alles völlig
richtig.

Ich sage ja nicht immer (aber immer öfter), dass M$ Murx macht. In diesem Fall ist die DIN irgendwie seltsam. Aber da die von wichtigen, intelligenten Leuten beschlossen wurde (so wie die Rechtschreibdeform auch, vermute ich), muss ich akzeptieren, dass hier einfach nur meine geistige Kapazität nicht ausreicht, denn Sinn zu verstehen. Oder ich bin einfach nur ein tragisches Einzelschicksal, in dessen Anwendungsfällen das typische Runden einfach nie auftritt, weil er nur kaufmännisch runden muss.

Ich persönlich runde mittlerweile so, dass ich bei glatter Komma-Fünf auf die nächste durch 3 teilbare Zahl runde, denn erstens ist drei Mal Bremer Recht, und zweitens sind aller guten Dinge drei. Das ganze gilt nicht an Feiertagen, die nicht durch drei teilbar sind, sowie an Tagen, an denen der Postbote eine Schuhgröße größergleich 45 hat, außer die Haarlänge in Zentimetern multipliziert mit der Anzahl der Löcher in den Socken erhöht um 1 ist durch 3 teilbar. An diesen Tagen runde ich pauschal alles auf Pi. Das nenne ich ab sofort die Deppen- und Idioten-Norm 3.314…

Gruß, Manfred

Wo bzw. wie schreibt man diese Funktion hin??
Hi
kannst du mir noch kurz sagen, wie man die Funktion in VB einbaut, gehört die in die Form, ins Modul oder an die Stelle wo ich runden will.
Habe noch nicht soviel mit Funktionen gemacht.
Es kommt aber immer eine Fehlermeldung.

Mfg Werner

Hallo Manfred,

Ich sage ja nicht immer (aber immer öfter), dass M$ Murx
macht. In diesem Fall ist die DIN irgendwie seltsam.

das scheint schon länger so zu sein, das Buch, aus dem ich das habe, ist von 1965. Ich schätze, daß diese DIN älter als die Bundesrepublik ist.

Gruß, Rainer

Hall, Werner!

kannst du mir noch kurz sagen, wie man die Funktion in VB
einbaut, gehört die in die Form, ins Modul oder an die Stelle
wo ich runden will.
Habe noch nicht soviel mit Funktionen gemacht.
Es kommt aber immer eine Fehlermeldung.

Wenn ich jetzt die Funktion von Karl Donaubauer verwende

Function fctRound(varNr As Variant, Optional varPl As Integer = 2) As Double
 'by Konrad Marfurt + ("" by) Luke Chung + Karl Donaubauer

 'raus hier bei nicht-nummerischem Argument
 If Not IsNumeric(varNr) Then Exit Function

 fctRound = Fix("" & varNr \* (10 ^ varPl) + Sgn(varNr) \* 0.5) / (10 ^ varPl)

End Function

kommt diese in ein globales Modul. An beliebigen Stellen, wo Du runden möchtest, rufst Du sie auf mit

...
meinUngerundeterWert = 12.75635
meineNachkommastellen=2
meinWert = fctRound(meinUngerundeterWert, meineNachkommastellen) ' ergibt 12,76
...

Das sollte eigentlich keine Fehler geben.

Gruß, Manfred

axo geht das
axo man muß da mit den Werten in Klammern die Daten übergeben.
Ich probiers mal aus, sollte dann aber klappen.

Danke.

Hallo Manfred,

Ist die letzte Stelle genau 5, wird auf eine gerade Zahl
gerundet.

1,5 und 2,5 ist nach der regel gerundet also beides 2. :wink:

Genau so rechnen die Microsoft Programme, ist alles völlig
richtig.

In diesem Fall ist die DIN irgendwie seltsam. Aber da
die von wichtigen, intelligenten Leuten beschlossen wurde (so
wie die Rechtschreibdeform auch, vermute ich), muss ich
akzeptieren, dass hier einfach nur meine geistige Kapazität
nicht ausreicht, denn Sinn zu verstehen.

Das ganze hat ein wening mit Statistik zu tun.
Wenn du eine Zahlenreihe hast, welche gerundet wird, macht es Sinn die eine Hälfte auf- und die Andere abzurunden.

Wenn du 100 Werte mit x.5 rundest liegt der Fehler für die Summe dieser Werte nach DIN, bei gleichmässiger Verteilung von geraden und ungeraden Werten, bei Null.
Bei er Regel mit IMMER Aufrunden ist die Summe immer um den Wert 50 zu gross.
Wenn man nach DIN rundet liegt der maximale Fehler bei +/-50, ist aber in der Regel immer kleiner als +/-50.

z.B. der Mittelwert von 1.5 und 2.5 ist 2 [(1.5 + 2.5)/2]

Nach DIN gerundet:
( 2 + 2) / 2 = 2

Nach deiner Regel:
(2 + 3) / 2 = 2.5 … gerundet gleich 3 !!

MfG Peter(TOO)