ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
5573
5573
EMPFEHLEN
-
Hallo,
gibt es in C# Onboardmittel für kaufmännisches Runden?
Ich gehe mal davon aus (zumindest habe ich nix gegenteiliges gefunden), dass die Math.Round(...) - Methode mathematisch rundet.
x,44499 ist rund x,044 nach kaufmännischer Rundung
x,44499 ist rund x,045 nach mathematischer Rundung auf 2 Stellen
Danke
DiLa
-
Diese Frage hättest aber vorher auch austesten können ....
Obiger Code ergibt 0.44Code :1
double test = Math.Round(0.444999, 2);
-
1. Du hast Recht.
2. Das Beispiel war schlecht gewählt und machte mein Problem nicht deutlich. (Darum 1.) Hätte ich das Problem nicht falsch beschrieben, wäre die Lösung nicht so einfach.
3. Meine Infos zum kaufmännischen Runden waren falsch, warum sich auch eine nachgereichte richtige Beschreibung des falschen Problems erübrigt.
4. Die Lösung (laut meinem jetzigen Kenntnisstand) heist:
Math.Round( 0.4445, 3, MidpointRounding.AwayFromZero)
Da eine 5 immer aufgerundet und nicht abgerundet wird.
Trotzdem Danke
DiLaGeändert von dila71 (31.08.06 um 13:26 Uhr)
-
In Zukunft bitte immer anführen für welches Framework die Lösung sein soll. Das ist Punkt 1.
Du willst eine kaufmännische Rundung, korrekt? Wenn ja, dann reicht meine Lösung vollkommen aus und du brauchst die Midpoint Enum überhaupt nicht mehr.
Aus 0.44499 wird 0.44
Aus 0.44501 wird 0.45
Das ist kaufmännische Rundung. Vermutlich brauchst du es auch nur für 2 Stellen, dann brauchst du auch nur 2 Stellen angeben.
-
Nochmal, muss ich mich geschlagen geben, was die Angebe des Framworks anbetrifft.
Aber:
Die Midpoint Enum muss ich angeben, denn diesmal hattest Du schlechte Beispiele.
0,445001 wird zu 0,45 auch ohne die Angabe MidpointRounding.AwayFromZero
ohne die 001 aber wird 0,445 zu 0,44 und das ist nicht kaufmännisch, da die 5 immer aufgerundet wird.
(Wie gesagt meine Angaben zum Kaufmännischen Runden haben sich aus verschiedenen Quellen auch öfter geändert, und ich kann nur von meinem jetzigen Kenntnisstand ausgehen.)
Da MidpointRounding.AwayFromZero das tut was der jetzigen Aufgabenstellung entspricht setze ich das Thema auf erledigt. Nochmal Danke.
-
Stimmt, bei 0.4450 rundet Math.Round ab. Unabhängig dessen, rundest du hoffentlich nicht bevor du weiterrechnest
-
Jein,
Am Ende einer Teilrechnung, aber an einigen Stellen wird bei den Vorschriften zu diesem Thema auch ein Runden "mittendrin" verlangt. Da muss ich dann eben vor dem Ende.
So bevor es zum Spam ausartet, letztmalig Danke und geschlossen
DiLa
-
11.07.11 11:37 #8
- Registriert seit
- May 2007
- Beiträge
- 7
Hallo,
habe bei mir ein seltsames Phänomen entdeckt mit der Funktion System.Math.Round:
Mach ich was falsch oder versteh ich was nicht richtig.
ich möchte die Zahl 294,405 auf zwei Nachkommastellen runden. Mit unten aufgeführten Code erhalte ich jedoch 294,4. Ich würde allerdings 294,41 erwarten.
Gebe ich 249,405 ein erhalte ich 249,41.
Ich kann die Funktionsweise von System.Math.Round nicht ganz nachvollziehen. Kann mir jemand weiterhelfen?
Code :1 2 3 4 5 6 7 8 9 10 11 12
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim t1 As Double = CType(TextBox1.Text, Double) Dim ergebnis As Double ergebnis = System.Math.Round((t1), 2, MidpointRounding.AwayFromZero) TextBox2.Text = ergebnis End Sub End Class
-
Du machst nichts falsch.
Die Zahlen werden für die Berechnung in ihren Binärwert umgewandelt.
Nun können Dezimalzahlen aber leider nicht 100% Binär dargestellt werden was zu leichten Abweichungen führt.
Das wiederrum führt dann natürlich zu einem Fehler beim Runden. Wobei es eigentlich garkein Fehler ist.
Mal ein Beispiel:
Code csharp:1 2 3 4 5 6 7 8 9 10 11
double x, y; x = 0.405; y = Math.Round(x, 2, MidpointRounding.AwayFromZero); Console.WriteLine(x + " => " + y); . . . x = 9.405; y = Math.Round(x, 2, MidpointRounding.AwayFromZero); Console.WriteLine(x + " => " + y);
Code :1 2 3 4 5 6 7 8 9 10
0,405 => 0,41 1,405 => 1,41 2,405 => 2,4 3,405 => 3,41 4,405 => 4,41 5,405 => 5,41 6,405 => 6,41 7,405 => 7,41 8,405 => 8,4 9,405 => 9,4
In order to understand recursion, one must first understand recursion.
-
Um die Antwort von rd4eva zu illustrieren:
du rundest in Wirklichkeit gar nicht die Zahl 8,405, sondern 8,40499973297111914
Probier einfach mal folgenden Beispielcode aus:
Die Formatangabe "R" steht für "round trip" und garantiert, dass die Konversation zwischen String und Double eindeutig ist (siehe MSDN). Wie du sehen wirst, wird deine Eingabe nicht so interpertiert, wie du es erwartest. Das hat den Grund, den rd4eva schon genannt hat: ein Double kann diese Zahl schlichtweg überhaupt nicht darstellen.Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
static void Test() { Double temp = 7.405f; print (temp); temp= Math.Round(temp, 3, MidpointRounding.AwayFromZero); print(temp); temp = 8.405f; print(temp); temp= Math.Round(temp,3, MidpointRounding.AwayFromZero); print(temp); Console.ReadKey(); } private static void print(Double value) { Console.WriteLine(value.ToString("R")); }
Geändert von Shakie (13.07.11 um 22:52 Uhr)
hihi = -h²
-
12.07.11 10:44 #11
- Registriert seit
- May 2007
- Beiträge
- 7
Hallo,
danke für die ausführlichen Erläuterungen. ich verstehe jetzt die Problematik.
Wie kann ich nun sicherstellen, dass x.405 auf x.41 aufgerundet wird und nicht ab?
gruß
-
Du musst einen anderen Datentyp verwenden, zum Beispiel Decimal statt Double.
hihi = -h²
Ähnliche Themen
-
Bewertungen Runden
Von emptynick im Forum PHPAntworten: 6Letzter Beitrag: 07.10.07, 20:30 -
Kaufmännisches Und bei JS
Von Divi im Forum .NET CaféAntworten: 2Letzter Beitrag: 01.03.07, 13:21 -
C# - Runden
Von Alexander12 im Forum .NET DatenverwaltungAntworten: 1Letzter Beitrag: 25.10.05, 17:43 -
Runden
Von Nanaki im Forum Visual Basic 6.0Antworten: 6Letzter Beitrag: 03.02.03, 16:33 -
Das Runden von Zahlenwerten
Von AleX im Forum Flash PlattformAntworten: 4Letzter Beitrag: 31.05.01, 19:28





Zitieren
Login





