PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Nachkommastelle einzeln erhalten


Gast
2011-10-15, 21:40:43
Hi,


ich muss Zahl zwischen 0.0 und 99.9 in die Ganzzahl und die Nachkommastelle zerlegen. Als Variable nehme ich einen double.

Wie mache ich das? Ich kann hier ja nicht mit dem Modulus arbeiten und stehe jetzt auf dem Schlauch.

Bspw von 99.5 in 99 und 5.

Alles was Google hergibt ist, mit Integers die digits zu bestimmen, aber nicht wenn ich einen double habe.

Danke für die Antwort.

PatkIllA
2011-10-15, 21:53:11
Abrunden für die Vorkommastellen. Und das abegrundete dann vom Gesamtwert abziehen und mal 10 nehmen.
Wofür soll das nützlich sein? Klingt jetzt fast so als wolltest du Prozente formatiert ausgeben.

Exxtreme
2011-10-15, 22:11:19
Man kann das auch in nen String konvertieren mit FloatToStr sprintf. Und dann die Nachkommastellen abschneiden indem man nach dem Punkt sucht.

PatkIllA
2011-10-15, 22:14:15
Man kann das auch in nen String konvertieren mit FloatToStr. Und dann die Nachkommastellen abschneiden indem man nach dem Punkt sucht.
Wenn man zum Berechnen Zahlen in Strings konvertiert, dann kann man das direkt als Pfusch abtun.

Gibt beim Codereview auf jeden Fall ein dickes WTF.
http://www.osnews.com/images/comics/wtfm.jpg

Exxtreme
2011-10-15, 22:19:37
Wenn man zum Berechnen Zahlen in Strings konvertiert, dann kann man das direkt als Pfusch abtun.

Gibt beim Codereview auf jeden Fall ein dickes WTF.
http://www.osnews.com/images/comics/wtfm.jpg
Der TE scheibt nicht, dass er damit weiter rechnen will. Von daher impliziere ich, dass es nur um die Ausgabe geht.

Grivel
2011-10-15, 22:23:11
Abrunden für die Vorkommastellen. Und das abegrundete dann vom Gesamtwert abziehen und mal 10 nehmen.
Wofür soll das nützlich sein? Klingt jetzt fast so als wolltest du Prozente formatiert ausgeben.

Sorry deine Methode funktioniert aber nur wenn du eine 99,5 eingibst und keine 99.5 oder sehe ich das falsch? der Befehl wäre ja floor fürs abrunden.

Den korrekten Befehl weiss ich leider nicht.

PatkIllA
2011-10-15, 22:26:45
Der TE scheibt nicht, dass er damit weiter rechnen will. Von daher impliziere ich, dass es nur um die Ausgabe geht.
Für die Ausgabe muss man da aber gar nichts auseinandernehmen sondern komplett direkt richtig formatieren. inkl dem für die Sprache passenden Dezimaltrennzeichen, der passenden Anzahl an Dezimalstellen und evtl. noch Text drum zu.
Sorry deine Methode funktioniert aber nur wenn du eine 99,5 eingibst und keine 99.5 oder sehe ich das falsch? der Befehl wäre ja floor fürs abrunden.Er hat doch schon einen double und keinen string. Das Problem mit den unterschiedlichen Sprachen kommt bei den Stringgefummel nämlich auch noch hinzu und sind nette Fehlerquellen. Das hab ich schon einige Male gesehen, wo das auch im Livebetrieb zu Fehlern kommt.

Grivel
2011-10-15, 22:44:35
Er hat doch schon einen double und keinen string. Das Problem mit den unterschiedlichen Sprachen kommt bei den Stringgefummel nämlich auch noch hinzu und sind nette Fehlerquellen. Das hab ich schon einige Male gesehen, wo das auch im Livebetrieb zu Fehlern kommt.
Okay.

Kannst du mir das erklären?Habe gerade deine Methode probiert, da ich auch kein Profi in C++ bin.

Habs nicht hinbekommen. Habe einen double b gehabt und denn mit floor (b) abgerundet. aber wenn ich den double b habe (bspw. 3.5) rundet er nicht ab, sondern lässt die Zahl stehen. Mit einer 3,5 geht dies einwandfrei (so hab ich das auch gelernt)

Ich kenne nur die Dirty Methode mit +/- 0.5 um bei Punkten abzurunden.

del_4901
2011-10-16, 00:09:55
http://www.cplusplus.com/reference/clibrary/cmath/modf/

Grivel
2011-10-16, 00:10:23
http://www.cplusplus.com/reference/clibrary/cmath/modf/
danke für die Antwort, mir ist der Fehler inzwischen selbst aufgefallen:redface:

SimonX
2011-10-16, 01:00:04
steht schon oben

Tiamat
2011-10-16, 12:32:13
int *zerlegen(double x) {
int *fragment = new int[2]; // 0 ganzzahl, 1 nachkommastellen
fragment[0] = (int) x;
fragment[1] = (int) ((x - (int) x) * 10);

return fragment;
}


Geht natürlich nur, wenn die Dezimalzahl 0,x, x aus [1, 9] ist.

Gruß
Tiamat

Pinoccio
2011-10-16, 13:19:51
Geht natürlich nur, wenn die Dezimalzahl 0,x, x aus [1, 9] ist.Putzigerweise kommt da dann nur x=5 in Frage. Alle anderen sind in Double nicht darstellbar.

mfg

Tiamat
2011-10-16, 17:42:30
Du verwechselst da grad was. Die erste Nachkommastelle im Binärsystem is 1/2, aber das is ja für den Dezimalwert egal.

del_4901
2011-10-16, 17:52:51
int *zerlegen(double x) {
int *fragment = new int[2]; // 0 ganzzahl, 1 nachkommastellen
fragment[0] = (int) x;
fragment[1] = (int) ((x - (int) x) * 10);

return fragment;
}


Geht natürlich nur, wenn die Dezimalzahl 0,x, x aus [1, 9] ist.

Gruß
Tiamat
Warum muss immer das Rad neu erfunden werden? Und dabei dann auch noch so super ineffizient und fehleranfaellig Speicher vom Heap hohlen...

Tiamat
2011-10-16, 17:54:21
:facepalm:
Is doch nur n Beispie, was das Prinzip verdeutlichen soll.

AwesomeSauce
2011-10-16, 17:59:40
@Tiamat

Funktioniert so nicht. Für double d = 34.3 kommt zum Beispiel (34, 2) raus.

ENKORE
2011-10-16, 18:33:43
Es ist doch schon längst geklärt! Die Funktion heisst modf, wurde schon weiter oben verlinkt, und ist in der C-Standardbibliothek in math.h ;)

Tiamat
2011-10-16, 18:35:05
stimmt, die Korrektur lautet


fragment[1] = (int) round((x - (int x) * 10);