Kaufmännisches Runden

dila71

Mitglied
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 ....
Code:
double test = Math.Round(0.444999, 2);
Obiger Code ergibt 0.44
 
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

DiLa
 
Zuletzt bearbeitet:
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.
 
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
 
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:
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:
C#:
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:
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
 
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:
C#:
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"));
}
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.
 
Zuletzt bearbeitet:
Zurück