Laden...

Runden mit Math.Round liefert nicht den erwarteten Wert zurück

Erstellt von BK01 vor 14 Jahren Letzter Beitrag vor 14 Jahren 10.509 Views
B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 14 Jahren
Runden mit Math.Round liefert nicht den erwarteten Wert zurück

Hallo zusammen,

eigentlich kann es nicht so schwer sein. Ich will auf 3 Nachkommastellen runden.

Beispiel:


double param1 = 38.05;
double param2 = 4;

param1 = param1 / param2;
param1 = System.Math.Round(param1,3);
MessageBox.Show("Der Wert lautet: " + param1.ToString());

//38.05 / 4 = 9,5125 --> Zielwert: 9,513

Die Funktion liefert mir aber nur 9,512 zurück. Mit float fnktioniert es auch nicht.

Gruß
BK

C
116 Beiträge seit 2004
vor 14 Jahren

Probier mal aus:

param1 = System.Math.Round(param1, 3, MidpointRounding.AwayFromZero);

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,


param1.ToString("0.000")

wäre auch eine Lösung dafür.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Gelöschter Account
vor 14 Jahren

das ist kein fehler.

Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.
6.911 Beiträge seit 2009
vor 14 Jahren

das ist kein fehler.

Das stimmt.

Noch zur Erklärung: In .net ist mathematisches Runden implementiert und vom Fragesteller wird kaufmännisches Runden erwartet (dies wird auch in der Schule gelehrt).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 14 Jahren

Also ich muss kaufmännisch Runden, deswegen ist "Math.Round" in meinen Augen falsch.

Ab 5 muss aufgerundet werden, ab 6 bringt mir die Funktion nichts mehr.

MidPointRounding hat nicht funktioniert.

param1.ToString("0.000") liefert das gewünschte Resultat zurück! Herzlichen Dank!

Beste Grüße
BK

1.361 Beiträge seit 2007
vor 14 Jahren

Hi BK01,

MidPointRounding hat nicht funktioniert.

Nur zur Klarstellung: Ich weiß ja nicht, was und wie du es probiert hast, aber Counterfeit's Vorschlag

param1 = System.Math.Round(param1, 3, MidpointRounding.AwayFromZero);

funktioniert einwandfrei und ist wohl auch der Weg, den man gehen sollte. (Man will ja vielleicht nicht jede Zahl erstmal in nen String wandeln, nur weil man das Ergebnis zwischendrin runden will/muss)

Siehe MidpointRounding Enumeration:

AwayFromZero: When a number is halfway between two others, it is rounded toward the nearest number that is away from zero.
ToEven: When a number is halfway between two others, it is rounded toward the nearest even number.

beste Grüße
zommi

Gelöschter Account
vor 14 Jahren

MidPointRounding hat nicht funktioniert.

doch das funktioniert. irgendwo hast du dann etwas falsch gemacht.

B
BK01 Themenstarter:in
203 Beiträge seit 2005
vor 14 Jahren

param1 = System.Math.Round(param1, 3, MidpointRounding.AwayFromZero); 

Funktioniert. - Wenn Datentyp == double

Ich hatte bei ein paar Versuchen auf float umgestellt und dann kommt hier auch wieder das falsche Ergebnis raus.

Hier mein Fehler:


float param1 = 38.05f;
            float param2 = 4;

            param1 = param1 / param2;
            param1 = (float)System.Math.Round(param1, 3, MidpointRounding.AwayFromZero);
            //param1 = double.Parse(param1.ToString("0.000"));
            MessageBox.Show("Der Wert lautet: " + param1.ToString());


Nochmals vielen Dank für die Erklärungen und die Hilfe!

Gruß
BK

Gelöschter Account
vor 14 Jahren

Ich hatte bei ein paar Versuchen auf float umgestellt und dann kommt hier auch wieder das falsche Ergebnis raus.

da kam auch das korrekte heraus. beim cast von float auf double tritt ein effekt ein. bezogen auf dein beispiel wird aus einem float "9,5125" eine double "9,51249980926514", was dann beim runden natürlich eine "9,512" ergibt.

die methode "Round" erwartet ein double und castet somit automatisch dein float in das double.

weiterführendes zu diesen effekt kannst du hier nachlesen: [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler