| |
VB.NET - Ein- und UmsteigerRe: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 17.10.10 22:23 |
| OK da haben die wirklich einen Fehler in die Erklärung reingebaut... oder sich jedenfalls doppeldeutig ausgedrückt, obwohl ich das doppeldeutig nicht entdecken kann.
Und wie kann ich jetzt machen, dass immer abgerundet wird? Man muss dazusagen, dass ich schon 0.5F dazuzähle, um etwas zu korrigieren, also fällt -0.5F schon weg oder?
Danke schonmal | |
Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 17.10.10 21:43 |
| Hallo Leute,
wenn ich aufrufe: Math.Round(3.5F, MidpointRounding.ToEven) gibt die Funktion mir 4 zurück, obwohl ich 3 erwarte...
Näheres hier:
http://msdn.microsoft.com/de-de/library/ef48waz8%28v=VS.80%29.aspx
http://msdn.microsoft.com/de-de/library/system.midpointrounding%28v=VS.80%29.aspx
Habe ich einen Denkfehler?
Freue mich schon auf eure tollen Antworten, und schon mal danke im Vorraus ;) | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Preisser | Datum: 17.10.10 22:06 |
| Hallo,
nein, das stimmt schon. ToEven (even = gerade) bedeutet ja, wenn eine Zahl genau zwischen zwei Ganzzahlen liegt, wird sie auf die am nächsten liegende gerade Zahl gerundet, um Rundungsfehler zu verringern, die sich dadurch ergeben, dass man immer auf eine Seite rundet (evtl. ist da im VS ein Fehler bei der deutschen Doku passiert, denn dort steht "Wenn eine Zahl genau zwischen zwei Ganzzahlen liegt, wird sie auf die nächste kleinere Ganzzahl abgerundet.", was aber nicht stimmt).
3.5 und 4.5 werden so jeweils auf 4 gerundet.
Beitrag wurde zuletzt am 17.10.10 um 22:14:20 editiert. | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Manfred X | Datum: 18.10.10 07:00 |
| Hallo!
Ergänzender allgemeiner Hinweis:
Die Rundungsmethoden (System.Math.Round) für die
IEEE-Datentypen Single/Double setzen IEEE Konventionen um, d.h.
sie liefern nicht immer das Ergebnis, wie man es erwarten würde:
Betrachten wir folgende Zahl (insgesamt 11 Stellen):
170601.85815
Rundet man diese Zahl als DECIMAL auf 4 Stellen
(MidPointRounding.AwayFromZero) erhält man, wie erwartet:
170601.8582
Rundet man diese Zahl als DOUBLE auf 4 Stellen
(MidPointRounding.AwayFromZero) erhält man:
170601.8581
Das Verhalten bei Verwendung von MidpointRounding.ToEven
ist entsprechend.
Bei hinreichend kleiner Stellenzahl kann man die IEEE-Konv.
umgehen, wenn man vor dem Runden die CDec-Konvertierung des Double-Wertes
durchführt (=die Decimal-Rundung).
Dim dbl as Double = 170601.85815
Dim rd As Double = Math.Round(CDec(dbl), 4, MidpointRounding.AwayFromZero)
Übrigens: 0.5F ist ein Singlewert; 0.5# bzw. 0.5R liefert einen Double-Wert.
Was für ein MidPoint-Rundungsverfahren benötigst Du genau?
Wie soll es sich bei negativen Werten verhalten?
MfG
Manfred | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 18.10.10 08:41 |
| Aha. Auch wenn ich nicht alles genau verstanden habe, glaube ich zu vermuten, was du meinst.
Mir ist es einfach nur wichtig, dass jede Zahl, egal ob 1 2 3 4 5 6 7 8 9 hinterm Komma immer abgerundet wird; die negativen Zahlen intressieren mich nicht, weil die im Programm nicht vorkommen... | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Manfred X | Datum: 18.10.10 09:25 |
| Hallo!
Suchst Du irgendwie so etwas?
Private Function RoundToULong(ByVal dbl As Double) As ULong
If dbl < 0 Then
Throw New ArgumentException
End If
'nächstniedrigere Ganzzahl bestimmen
Dim df As ULong = CULng(System.Math.Floor(dbl))
If dbl - df > 0.5# Then Return df + 1UL 'Nachkomma-Anteil > 0.5
Return df
End Function Diese Funktion sucht die nächst-erreichbare positive Ganzzahl.
ULong habe ich verwendet, damit auch große Double-Zahlen verarbeitet
werden können.
MfG
Manfred | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Nico1983HH | Datum: 18.10.10 09:50 |
| Ist Math.Truncate vllt das, was du suchst ? | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 18.10.10 17:25 |
| OK... also heisst das jetzt nur, dass ich auch decimal umstellen muss, dass der Mist endlich das tut, was er laut MSDN tun sollte? | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Nico1983HH | Datum: 18.10.10 17:36 |
| Willst du denn nun runden oder ohne Rücksicht auf Verluste abschneiden was hinterm Komma steht ??
Zweiteres tut Math.Truncate...
edit:
Zitat: | | Mir ist es einfach nur wichtig, dass jede Zahl, egal ob 1 2 3 4 5 6 7 8 9 hinterm Komma immer abgerundet wird; die negativen Zahlen intressieren mich nicht, weil die im Programm nicht vorkommen... | |
Genau das macht Truncate.
Beitrag wurde zuletzt am 18.10.10 um 17:57:58 editiert. | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 18.10.10 19:29 |
| Entschuldigung bitte, da hatte ich mich vertan.
Ich will eine Zahl "abrunden", wobei die x.5-Stelle noch abgerundet wird. | |
Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? | | | Autor: Moeppel | Datum: 18.10.10 19:38 |
| Danke Leute für eure supertollen Antworten und die ausgetüftelten Lösungsansätze
Ich habe das Problem jetzt mit Math.Floor bzw. Math.Truncate übergangen. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|