Nachkommastellen
-
Hallo, Ich wollte mit folgender Methode feststellen, wieviele Nachkommastellen eine Zahl hat und dementsprechend runden:
CString Test::Nachkomma(double zahl) { CString stringZahl; double zahlA=(zahl-(int)zahl)*10; int zahlB=(int)zahlA; if(zahl-(int)zahl==0) stringZahl.Format("%.0f", zahl); else if(zahlB==zahlA) stringZahl.Format("%.1f", zahl); else stringZahl.Format("%.2f", zahl); return stringZahl; }Jetzt macht mir aber der Typecast am Anfang probleme: wenn ich als Zahl z.B. 12.2 vorgebe, erhalte ich für zahlA also 2,0. Wenn ich das dann in int caste, erhält zahlB plötzlich die 1!!!! Warum denn bitte das??! Die einzige Erklärung die ich hätte wär, weil 2,0 eigentlich schon int ist. Ich benötige aber den realen Wert in zahlB, weil sonst das ganze ja nicht funktioniert. Oder kennt jemand ne andere Möglichkeit, eine Zahl auf Nachkommastellen zu prüfen?!
-
Ich check die Funktion irgendwie nicht. Wo steht deine Information, auf wieviele Nachkommastellen du runden willst?
Schreib mal ein (oder mehrere) Beispiel(e), was Du für einen double-Wert rein steckst und was dann als String raus kommen soll.Gruß,
Phips!
-
eigentlich ganz einfach, folgendes soll geschehen:
in zahlA werden die Nachkommastellen von der eing. Zahl gespeichert und *10 genommen, also bei 12.2 steht in zahlA 2. Dann soll in zahlB die int gecastete zahlA stehe, in dem Fall also auch 2. Wenn jetzt der int Wert von Zahl gleich Zahl ist, hat sie ja keine Nachkommastelle (int schneidet ab), also wird auf 0 Nachkommastellen gerundet. Wenn jedoch der Wert in zahlA gleich dem in zahlB ist gibt es ja folglich genau eine Nachkommastelle. Inm allen anderen Fällen soll auf 2 gerundet werden. Allerdings macht mir der Typecast probleme: Obwohl in zahlA 2.0 steht erhalte ich in zahlB eine 1!! Gebe ich z. B. 12.34 vor funktioniert es (zahlA=3.4, zahlB=3).
-
Also grundsätzlich wäre ich mit solchen Casts immer sehr vorsichtig, außerdem machen sie (meiner Meinung nach) hier den Code etwas unübersichtlich. Wenn Du bei einem double-Wert die Nachkommastellen abschneiden willst, dann nimm doch lieber die Funktion floor() (in "math.h"). Damit sollte es funktionieren.
Gruß,
Phips!
-
Aber wär die Funktion so nicht viel einfacher?
CString Test::Nachkomma(double zahl) { CString Ret; // Double auf zwei Stellen runden Ret.Format("%.2f",zahl); // Alle Nullen ganz rechts abschneiden Ret.TrimRight('0'); // Eventuell auch noch den Punkt abschneiden // Wenn double garkeine Nachkomma-Stellen hat Ret.TrimRight('.'); return Ret; }Gruß,
Phips!