vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ;)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? 
Autor: ModeratorDaveS (Moderator)
Datum: 17.10.10 22:06

4 ist ja gerade, 3 nicht.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? 
Autor: Nico1983HH
Datum: 18.10.10 09:50

Ist Math.Truncate vllt das, was du suchst ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Math.Round(Double, MidpointRounding) rundet nicht richtig? 
Autor: ModeratorDaveS (Moderator)
Datum: 18.10.10 11:50

Ja, Manfred's Beiträge sind auch oft eine Herausforderung. Fließkomma wird nie richtig mit MidpointRounding umgehen, weil die Werte binär und nicht Dezimal sind. Auch 3.5R wird ein ganz wenig mehr oder weniger als genau 3,5 sein, in den meisten fällen. So Microsoft dazu. Wenn du kaufmännische Berechnungen machst dann immer besser mit Decimal.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel