runden

BLR

Erfahrenes Mitglied
Hallo zusammen,

wie kann man in c++ runden und zwar die Nachkommastellen?
Wenn man z.b die Zahl hat: 65,3456 dann möchte ich die letzen Zweistellen runden auf: 65,35.
Irgendwie mit std::setprecision****

irgendwie probiere ich da wild herum, aber es kommt nix richtiges raus. danke
 
Hallo BLR

Eine Möglichkeit ist:
C:
float roundDigits(float num, unsigned int numDigits) {
	if (numDigits == 0) {
		return std::round(num);
	}

	return std::round(num * numDigits * 10.0f) / (numDigits * 10.0f);
}

Zu beachten:
Ungenaugikeiten auf Grund von float. Du bekommst also eine Zahl ungefähr in der Nähe der gerundeten, für eine Ausgabe ist dann sowas wie std::setprecision zu empfehlen.

Viele Grüsse
Cromon
 
danke dir für den Tipp.
Eben ich verwende "setprecision"
aber der Sinn von "round(num)" ist mir noch unschlüssig wenn schon "setprecision" kürzt
 
Hallo BLR

std::setprecision ist ein Modifikator für den Ausgabe-/Eingabestrom. Das heisst die Zahl wird einfach für die Ausgabe gerundet, an der Zahl selber ändert sich jedoch nichts.

Viele Grüsse
Cromon
 
ich habe vergessen zu erwähnen, dass ist std::floor() verwende, weil ich mit dem 98ger Standard arbeiten muss.
wenn ich folgende Zahl angebe:

0.0834567356
dann wünsche ich mir, dass 4 Stellen nach dem Komma gerundet wird und sowas rauskommt:
0.0835
wenn ich allerdings deinen Vorschlag verwende kommt da
3.5946.....raus.
Irgendwas hab ich nicht verstanden bei deiner Lösung.
 
Hallo BLR

ein korrektes Runden ist mit std::floor auch möglich, dann musst du aber da wo jetzt std::round verwendet wird noch + 0.5 machen.

Bezüglich der Rundung: Es muss natürlich 10 ^ numDigits sein, nicht 10 * numDigits, als bei 4 sollte dann da 10'000 kommen und nicht 40. Dann bekommst du auch so etwas im Bereich 0.08349999.

Viele Grüsse
Cromon
 
Hallo Cromon :)
Welchen Sinn hat die Addition von 0,5****?
leider hab ich noch nicht ganz das richtige Ergebniss^^

So wie ich dich verstanden habe, sollte die Zeile so aussehen:

Code:
zahl = 0,776543
roundDigit = floor(zahl * pow(10.0f,4))+0.5 / (pow(10.0f,4));

Aber ich bekomme da 7765,43.....
Eigentlich sollte es sein: 0,7766

Danke
 
Hallo BLR

Problem 1:
Punkt vor Strich:
roundDigit = floor(zahl * pow(10.0f,4))+0.5 / (pow(10.0f,4));
ist
roundDigit = floor(zahl * pow(10.0f,4)) + (0.5 / (pow(10.0f,4)));

Problem 2:
Die 0.5 addierst du zu zahl * pow(10.0f, 4) und floorst dann. Überlegung:
falls kommastelle < 0.5 -> kommastelle + 0.5 < 1 -> abrunden
falls kommastelle >= 0.5 -> kommastelle + 0.5 >= 1 -> aufrunden

Beispiele:
0.5 + 0.5 = 1 -> floor -> 1
0.4 + 0.5 = 0.9 -> floor -> 0
0.99 + 0.5 = 1.49 -> floor -> 1

Grüsse
Cromon
 

Neue Beiträge

Zurück